android系统会发送许多系统级别的广播,比如屏幕关闭,电池电量低等广播。同样应用可以发起自定义“由开发者定义的”广播。广播是从一个应用内部向另一个应用发送消息的途径之一。
BroadcastReceiver是一个可以监听和响应广播的组件。本文中,我们将会演示如何发送自定义广播以及如何通过编程和使用Manifest文件定义一个BroadcastReceiver来监听这一广播。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_gravity="center_horizontal" android:text="Received Broadcasts" /> <Button android:id="@+id/btnSendBroadcast" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_gravity="center_horizontal" android:text="Send Broadcast" /> <EditText android:id="@+id/etReceivedBroadcast" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
package com.hmkcode.android; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { MainActivity mainActivity = ((MyApplication) context.getApplicationContext()).mainActivity; mainActivity.etReceivedBroadcast.append("broadcast: "+intent.getAction()+" "); } }
Intent i = new Intent("com.hmkcode.android.USER_ACTION"); sendBroadcast(i);
你可以通过java代码动态注册或在Manifest xml文件中进行注册。
@Override protected void onResume() { super.onResume(); registerReceiver(new MyReceiver(), new IntentFilter("com.hmkcode.android.USER_ACTION")); }
<receiver android:name="com.hmkcode.android.MyReceiver" > <intent-filter> <action android:name="com.hmkcode.android.USER_ACTION" /> </intent-filter> </receiver>
package com.hmkcode.android; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener { MyReceiver myReceiver; IntentFilter intentFilter; EditText etReceivedBroadcast; Button btnSendBroadcast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etReceivedBroadcast = (EditText) findViewById(R.id.etReceivedBroadcast); btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast); //keep reference to Activity context MyApplication myApplication = (MyApplication) this.getApplicationContext(); myApplication.mainActivity = this; btnSendBroadcast.setOnClickListener(this); myReceiver = new MyReceiver(); intentFilter = new IntentFilter("com.hmkcode.android.USER_ACTION"); } @Override protected void onResume() { super.onResume(); registerReceiver(myReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(myReceiver); } @Override public void onClick(View view) { Intent intnet = new Intent("com.hmkcode.android.USER_ACTION"); sendBroadcast(intnet); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hmkcode.android" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:name="com.hmkcode.android.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.hmkcode.android.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="com.hmkcode.android.MyReceiver" > <intent-filter> <action android:name="com.hmkcode.android.USER_ACTION" /> </intent-filter> </receiver> </application> </manifest>
注:如果你想通过Manifest XML文件注册接收器,那么需要从MainActivity类中移除onResume和onPause方法。
当使用xml注册接收器时,系统将ReceiverResctrictredContext传递给onReceive()方法。为了能在EditText中进行打印,需要获取MainActivity context,因此需要通过扩展Application来持有MainActivity的引用。
package com.hmkcode.android; import android.app.Application; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); } MainActivity mainActivity; }
注意:我们在Manifest文件中使用了MyApplication。
<application android:name="com.hmkcode.android.MyApplication"
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务