HardBirch

BroadcastReceiver静态与动态注册的差别示例

时间:13-06-19 栏目:安卓技术篇 作者:魔豆先生 评论:0 点击: 6,820 次

动态注册

动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听

下面是具体的例子:

BroadcastTest.java

package net.mythroad.test;  

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class BroadcastTest extends Activity {

private static final String ACTION = "com.czz.test.SENDBROADCAST";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.broadcast_test);
Button btnSendBroadcast = (Button) this.findViewById(R.id.send);
final Button btnRegisteBroadcast = (Button) this.findViewById(R.id.registe);
final Button btnUnregisteBroadcast = (Button) this.findViewById(R.id.unregiste);
btnRegisteBroadcast.setEnabled(true);
btnUnregisteBroadcast.setEnabled(false);
btnSendBroadcast.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendBroadcast(new Intent(ACTION));
}
});

btnRegisteBroadcast.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION);
registerReceiver(myReceiver, filter);
btnRegisteBroadcast.setEnabled(false);
btnUnregisteBroadcast.setEnabled(true);
}
});

btnUnregisteBroadcast.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
unregisterReceiver(myReceiver);
btnRegisteBroadcast.setEnabled(true);
btnUnregisteBroadcast.setEnabled(false);
}
});
}

private BroadcastReceiver myReceiver = new BroadcastReceiver(){

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "myReceiver receive", Toast.LENGTH_SHORT).show();
}

};
}

broadcast_test.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="0px"
android:visibility="gone"
android:src="@drawable/earth"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Broadcast test"
android:singleLine="true"
android:gravity="center_horizontal"
/>
<Button  android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send broadcast"
android:layout_marginLeft="20px"
/>
<Button  android:id="@+id/registe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="registReceiver"
android:layout_marginLeft="20px"
android:layout_marginTop="20px"
/>
<Button  android:id="@+id/unregiste"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="unregistReceiver"
android:layout_marginLeft="20px"
android:layout_marginTop="20px"
/>
</LinearLayout>
</FrameLayout>

静态注册

静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。

静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听。比如某个程序时监听内存 的使用情况的,当在手机上安装好后,不管该应用程序是处于什么状态,都会执行改监听方法中的内容。

下面是具体的例子:

MyReceiver.java

 

public class MyReceiver extends BroadcastReceiver{
//定义日志标签
private static final String TAG = "Test";
@Override
public void onReceive(Context context, Intent intent){
//输出日志信息
Log.i(TAG, "MyReceiver onReceive--->");
}
}

AndroidManifest.xml

com.android.broadcast.RECEIVER_ACTION

是你activity中的ACTION

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.broadcast"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".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="MyReceiver">
<intent-filter>
<action android:name="com.android.broadcast.RECEIVER_ACTION"/>
</intent-filter>
</receiver>
</application>
</manifest>

 

 注意:

如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决, BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束 BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 .
每 次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁. 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application NoResponse) 的对话框 .

 

声明: 本文由( 魔豆先生 )原创编译,转载请保留链接: BroadcastReceiver静态与动态注册的差别示例

BroadcastReceiver静态与动态注册的差别示例:等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐