黑马程序员------------------Android SharedPreferences与BroadcastReceiver简单结合(手机号码自动加拨)

                                                       ------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的四种操作模式:
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做的小应用。用来在打电话时候自动加拨号码 我就一直在使用
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了。

附图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值