------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
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做的小应用。用来在打电话时候自动加拨号码 我就一直在使用
package com.tai.ipcall;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener
{
public static String IPSTORE = "ipstore";
boolean isExit;
private EditText editIP;
private Button buttonOK;
private Button buttonCancel;
private SharedPreferences sp = null;
private Editor ipeditor = null;
private int keyBackClickCount;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置无顶部菜单
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView()
{
editIP = (EditText) findViewById(R.id.ipeditor);
buttonOK = (Button) findViewById(R.id.button_ok);
buttonOK.setOnClickListener(this);
buttonCancel = (Button) findViewById(R.id.buton_cancel);
buttonCancel.setOnClickListener(this);
}
private void initData()
{
sp = this.getSharedPreferences(IPSTORE, MODE_PRIVATE);
String ip = sp.getString("IP", "");
if(ip==null||ip.length()<1)
{
}
else if(TextUtils.isDigitsOnly(ip))
{
editIP.setText(ip);
buttonOK.setText("修改绑定IP");
}
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.button_ok:
String ip = editIP.getText().toString().trim();
if(TextUtils.isEmpty(ip))
{
Toast.makeText(this, "请输入正确的IP", Toast.LENGTH_SHORT).show();
}
else
{
ipeditor = sp.edit();//向SharedPreferences中写入数据
ipeditor.putString("IP", ip);
ipeditor.commit();
Toast.makeText(this, "绑定成功!!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.buton_cancel:
ipeditor = sp.edit();//从SharedPreferences删除入数据
ipeditor.remove("IP");
ipeditor.commit();
Toast.makeText(this, "解除成功!!", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)//点击两次退出程序
{
if(keyCode==KeyEvent.KEYCODE_BACK)
{
switch (keyBackClickCount++)
{
case 0:
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
keyBackClickCount--;
}
}, 2000);
break;
case 1:
System.exit(0);
break;
default:
break;
}
}
return true;
}
}
这里个人喜欢这样为按钮注册事件,方便,看起来也好看
@Override
public void onClick(View v)
{
switch (v.getId())
{
case id1:
String ip = editIP.getText().toString().trim();
...
break;
case id2:
...
break;
.
.
.
default:
break;
}
}
package com.tai.ipcall;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class OutCall extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
System.out.println("只要有电话外拨就调用这个方法");
SharedPreferences sp = context.getSharedPreferences(MainActivity.IPSTORE, Context.MODE_PRIVATE);
String number = getResultData();
if (null!=number&&null!=sp&&!"".equals(sp)) {
if(number.startsWith("+86"))
{
number= number.replace("+86","");
System.out.println("号码开头是+86处理之后的号码为:" + number);
}
if(number.startsWith("17951"))
{
number= number.replace("17951","");
System.out.println("号码开头是17951处理之后的号码为:" + number);
}
String ip = sp.getString("IP", "");
setResultData(ip.trim()+number);
System.out.println(ip.trim()+number);
}
}
}
最后要附上权限、注册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了。
附图: