安卓四大组件的复习——实现IP拨号Demo
今天对于广播从新复习下~~~~~~~~~~~~~~·
第一点,我们为什么要用广播,方便了我们做什么事?
答案:
(1)如果没有广播 ,系统一开机,啥都没有,一个系统没有软件,就像吃饭没有菜一样,有了广播,一开机,系统就用广播大喊:"我要开机了",软件就会听到,启动,为用户准备好了一些常用的软件。
(2)方便我们开发,如果我们要开机启动,就可以监听系统开机广播。
第二点 谷歌为什么要将广播定义成四大组件?
答案:
作为安卓的四大组件,他有着重要的作用,让应用的关系更加得紧密了。
好啦,废话不多说就用一个demo 来讲解吧
界面是:

Demo需求:拨打电话的时候,自动加上一个IP号码
界面:Edittext 是用来输入 要 IP号码 Button是用来保存到SP中去
思路:先将IP号码用Sp缓存起来
代码实现: 主类获取Edittext的号码 并且用SP缓存起来 在activity启动的时候,获取sp中缓存的号码
然后新建一个广播 监听拨打电话的广播,获取其号码 在前段加上IP号码
package com.itheima.ipdail;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_ipnumber;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_ipnumber = (EditText) findViewById(R.id.et_ipnumber);
sp = getSharedPreferences("config", MODE_PRIVATE);
et_ipnumber.setText(sp.getString("ipnumber", ""));
}
public void click(View view){
String ipnumber = et_ipnumber.getText().toString().trim();
Editor editor = sp.edit();
editor.putString("ipnumber", ipnumber);
editor.commit();
Toast.makeText(this, "设置完成", 0).show();
}
}
基本上代码没有难度,唯一有点难度的是 SP缓存了 sp是activity中内置的一个方法 可以直接通过 Context.getSharedPreferences
第一个参数是 文件名字,第二个参数是 保存模式 因为SP无法实现直接编辑 要通过一个借口edit(); 得到一个Editor 才能进行编辑
到了 新建广播类了,首先遵循安卓的原则,四大组件都要在配置文件中注册
<!-- 定义了一个广播接受者 new出来了一个收音机 ,设置action 就相当于设置了监听的频道 --><receiver android:name=".OutCallReceiver" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
可以看出来 在配置文件中他的名字是receiver 后面的是要注册广播的名字,下一级节点是过滤器 指定动作是 拨打电话 android.intent.action.NEW_OUTGOING_CALL
因为我们要监听 拨打电话 所以要加上 权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
现在可以回到广播类中编辑代码了,
package com.itheima.ipdail;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class OutCallReceiver extends BroadcastReceiver {
//当有广播事件产生的时候 就会执行onrecevie方法
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onreceiver 发现了新的外拨电话...");
String number = getResultData();//外拨的电话号码
System.out.println("number="+number);
//替换掉这个号码
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String ipnumber = sp.getString("ipnumber", "");
String newnumber = ipnumber+number;
//设置外拨的电话号码
setResultData(newnumber);
//不会生效的 广播终止不了 显示的指定了接受者
// abortBroadcast();
}
}