#广播接收者(广播接受者进程关闭了也能接收到广播,系统会在清单文件中找哪个广播接受者可以收到这条广播,然后去启动这个接受者的进程,找不到则广播发了就发了没人收到而已) * 现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 * Android中:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播 ###创建广播接收者 1. 定义java类继承BroadcastReceiver 2. 在清单文件中定义receiver节点,定义name属性,指定广播接收者java类的全类名 <receiver android:name="com.itheima.ipdialer.CallReceiver"> <intent-filter > <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> 3. 在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配,比如,如果要接受打电话广播, 那么action的值必须指定为 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> * 因为打电话广播中所包含的action,就是"android.intent.action.NEW_OUTGOING_CALL",所以我们定义广播接收者时, action必须与其匹配,才能收到这条广播(系统指定的action,打电话广播是系统创建和发送的) * 即便广播接收者所在进程已经被关闭,当系统发出的广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程, 并把广播发给该广播接收者
Activity:
package com.itheima.ipdialer; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.view.Menu; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View v){ EditText et = (EditText) findViewById(R.id.et); SharedPreferences sp = getSharedPreferences("ip", MODE_PRIVATE); sp.edit().putString("ipNumber", et.getText().toString()).commit(); } }
广播接受者:
package com.itheima.ipdialer; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; public class CallReceiver extends BroadcastReceiver { //接收到广播时就会调用 @Override public void onReceive(Context context, Intent intent) { //当拨打电话去往打电话应用的时候系统会发送android.intent.action.NEW_OUTGOING_CALL广播,被这个接受者拦截后给电话号码添加17951 //添加IP线路 //在打电话广播中,会携带拨打的电话的号码,通过以下代码获取到 String number = getResultData(); if(number.startsWith("0")){ SharedPreferences sp = context.getSharedPreferences("ip", Context.MODE_PRIVATE); String ipNumber = sp.getString("ipNumber", ""); //把IP线路号码添加至用户拨打号码的前面 number = ipNumber + number; //修改数据后把新的号码重新放入广播中 setResultData(number); abortBroadcast();//拦截修改后继续后面的操作 } } }
清单文件:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.ipdialer.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".CallReceiver"> <intent-filter > <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> </application>
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4947280.html,如需转载请自行联系原作者