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的两种方式:
方法名称 |
描述 |
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对应的数据项 |
写入:
<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了。
附图: