Android SharedPreferences与BroadcastReceiver简单结合

    BroadcastReceiver和SharedPreferences都Android为我们提供的很实用的API,这里就展示下简单的结合应用。

首先介绍下吧,SharedPreferences是Android平台上一个轻量级的存储类,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存。

SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,路径为:

/data/data/<package name>/shared_prefs ,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

  SharedPreferences的四种操作模式:
Context.MODE_PRIVATE  默认模式   文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND   模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
Context.MODE_WORLD_READABLE        当前文件可以被其他应用读取.
Context.MODE_WORLD_WRITEABLE      当前文件可以被其他应用写入.

   获取SharedPreferences的两种方式:

调用Context对象的getSharedPreferences()方法   这样获取的SharedPreferences对象可以被同一应用程序下的其他组件共享。
调用Activity对象的getPreferences()方法     这样获得的SharedPreferences对象只能在该Activity中使用。
SharedPreferences本身没有提供存储数据的API,要调用其内部的Editor接口,Edit这个接口有一系列的方法用于操作SharedPreference:
 

方法名称

描述

public abstract SharedPreferences.Editor clear ()

清空SharedPreferences里所有的数据

public abstract boolean commit ()

当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改

public abstract SharedPreferences.Editor putXXX (String key, boolean XXX)

向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值

public abstract SharedPreferences.Editor remove (String key)

删除SharedPreferences里指定key对应的数据项

 写入:

Editor sharedata = getSharedPreferences("data", MODE_PRIVATE).edit();
sharedata.putString("item","hello getSharedPreferences");
sharedata.commit();
读取:
SharedPreferences sharedata = getSharedPreferences("data", 0);
String data = sharedata.getString("item", null);
 
 
  BroadcastReceiver  广播接收者,顾名思义这是用来介绍广播的,这里的广播就是系统状态改变时或者自定义触发某些事件时候发出的通知。例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
  BroadcastReceiver使用的时候要像Activity那样需要注册,普通的方式就是再XML文件中注册:
<receiver android:name="MyReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
另外还有别的注册方式,这里用的就只是xml注册,所以暂不介绍另外的注册方式。简单使用的时候只要定义自己的类,重写onReceive方法即可。

这里就贴出来我用SharedPreferences、BroadcastReceiver做的小应用。用来在打电话时候自动加拨号码 我就一直在使用

  1 package com.tai.ipcall;
  2 
  3 import java.util.Timer;
  4 import java.util.TimerTask;
  5 
  6 import android.os.Bundle;
  7 import android.app.Activity;
  8 import android.content.SharedPreferences;
  9 import android.content.SharedPreferences.Editor;
 10 import android.text.TextUtils;
 11 import android.view.KeyEvent;
 12 import android.view.View;
 13 import android.view.View.OnClickListener;
 14 import android.view.Window;
 15 import android.widget.Button;
 16 import android.widget.EditText;
 17 import android.widget.Toast;
 18 
 19 public class MainActivity extends Activity implements OnClickListener
 20 {
 21     public static String IPSTORE = "ipstore";
 22     boolean isExit;
 23     private EditText editIP;
 24     private Button buttonOK;
 25     private Button buttonCancel;
 26     private SharedPreferences sp = null;
 27     private Editor ipeditor = null;
 28     private int keyBackClickCount;
 29     @Override
 30     protected void onCreate(Bundle savedInstanceState)
 31     {
 32         super.onCreate(savedInstanceState);
 33         requestWindowFeature(Window.FEATURE_NO_TITLE);//设置无顶部菜单
 34         setContentView(R.layout.activity_main);
 35         initView();
 36         initData();
 37     }
 38     
 39     private void initView()
 40     {
 41         editIP = (EditText) findViewById(R.id.ipeditor);
 42         buttonOK = (Button) findViewById(R.id.button_ok);
 43         buttonOK.setOnClickListener(this);
 44         buttonCancel = (Button) findViewById(R.id.buton_cancel);
 45         buttonCancel.setOnClickListener(this);
 46     }
 47     
 48     private void initData()
 49     {
 50         sp = this.getSharedPreferences(IPSTORE, MODE_PRIVATE);
 51         String ip = sp.getString("IP", "");
 52         if(ip==null||ip.length()<1)
 53         {
 54         }
 55         else if(TextUtils.isDigitsOnly(ip))
 56         {
 57             editIP.setText(ip);
 58             buttonOK.setText("修改绑定IP");
 59         }
 60     }
 61     
 62     @Override
 63     public void onClick(View v)
 64     {
 65         switch (v.getId())
 66         {
 67         case R.id.button_ok:
 68             String ip = editIP.getText().toString().trim();
 69             if(TextUtils.isEmpty(ip))
 70             {
 71                 Toast.makeText(this, "请输入正确的IP", Toast.LENGTH_SHORT).show();
 72             }
 73             else
 74             {
 75                 ipeditor = sp.edit();//向SharedPreferences中写入数据
 76                 ipeditor.putString("IP", ip);
 77                 ipeditor.commit();
 78                 Toast.makeText(this, "绑定成功!!", Toast.LENGTH_SHORT).show();
 79             }
 80             break;
 81 
 82         case R.id.buton_cancel:
 83                 ipeditor = sp.edit();//从SharedPreferences删除入数据
 84                 ipeditor.remove("IP");
 85                 ipeditor.commit();
 86                 Toast.makeText(this, "解除成功!!", Toast.LENGTH_SHORT).show();
 87             break;
 88         default:
 89             break;
 90         }
 91     }
 92     @Override
 93     public boolean onKeyDown(int keyCode, KeyEvent event)//点击两次退出程序
 94     {
 95         if(keyCode==KeyEvent.KEYCODE_BACK)
 96         {
 97             switch (keyBackClickCount++)
 98             {
 99             case 0:
100                 Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
101                 Timer timer = new Timer();
102                 timer.schedule(new TimerTask()
103                 {
104                     @Override
105                     public void run()
106                     {
107                         keyBackClickCount--;
108                     }
109                 }, 2000);
110                 break;
111             case 1:
112                 System.exit(0);
113                 break;
114             default:
115                 break;
116             }
117         }
118         return true;
119     }    
120     
121 }

这里个人喜欢这样为按钮注册事件,方便,看起来也好看

@Override
public void onClick(View v)
{
switch (v.getId())
{
case id1:
String ip = editIP.getText().toString().trim();
...
break;

case id2:
...
break;

.

.

.
default:
break;
}
}

 1 package com.tai.ipcall;
 2 
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.content.SharedPreferences;
 7 
 8 public class OutCall extends BroadcastReceiver
 9 {
10 
11     @Override
12     public void onReceive(Context context, Intent intent)
13     {
14         System.out.println("只要有电话外拨就调用这个方法");
15         SharedPreferences sp = context.getSharedPreferences(MainActivity.IPSTORE, Context.MODE_PRIVATE);
16         String number = getResultData();
17         
18             if (null!=number&&null!=sp&&!"".equals(sp)) {
19                 
20                 if(number.startsWith("+86"))
21                 {
22                     number= number.replace("+86","");
23                     System.out.println("号码开头是+86处理之后的号码为:" + number);
24                 }
25                 if(number.startsWith("17951"))
26                 {
27                     number= number.replace("17951","");
28                     System.out.println("号码开头是17951处理之后的号码为:" + number);
29                 }
30                 
31                 String ip = sp.getString("IP", "");
32                 setResultData(ip.trim()+number);
33                 System.out.println(ip.trim()+number);
34                 
35             }
36     }
37 
38 }

最后要附上权限、注册BroadcastReceiver

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

 

<receiver android:name="com.tai.ipcall.OutCall">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>

ok,就这么齐了,一款可以自动加拨号码的APP就ok了。

附图:

 

posted @ 2014-09-04 00:02  Mauiie_娢  阅读(917)  评论(0编辑  收藏  举报