[英]Not able to register Broadcast receiver Dynamically
我正在OnResume中注册我的接收器,而在OnPause中取消注册是我的代码有问题
package com.bd2;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.util.Log;
public class BroadcastReceiver2Activity extends Activity {
/** Called when the activity is first created. */
private NotificationManager mNotificationManager;
private int SIMPLE_NOTFICATION_ID;
IntentFilter intentfilter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
intentfilter = new IntentFilter();
intentfilter.addAction("android.intent.action.AIRPLANE_MODE");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
/*intfilter = new IntentFilter();
intfilter.addAction("android.intent.action.AIRPLANE_MODE");*/
registerReceiver(receiver, intentfilter);
// sendBroadcast();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(receiver);
}
private BroadcastReceiver receiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notifyDetails = new Notification(R.drawable.icon,"Time Reset!",System.currentTimeMillis());
PendingIntent myIntent = PendingIntent.getActivity(context, 0, new Intent(Intent.ACTION_VIEW, People.CONTENT_URI), 0);
notifyDetails.setLatestEventInfo(context, "Time has been Reset", "Click on me to view Contacts", myIntent);
notifyDetails.flags |= Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
Log.i(getClass().getSimpleName(),"Sucessfully Changed Time");
}
};
}
////////清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bd2"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastReceiver2Activity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
我没有收到通知。 如果我是静态地执行此操作
编辑#3:定义全局变量:
private IntentFilter mIntentFilter;
从onCreate处理程序中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mIntentFilter.addAction("android.intent.action.SERVICE_STATE");
mIntentFilter.addAction("android.intent.action.AIRPLANE_MODE");
registerReceiver(receiver, mIntentfilter);
}
从onResume处理程序中:
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
// Be careful here... mIntentFilter might be gc'd! add checking to this!
registerReceiver(receiver, mIntentFilter);
Log.d(TAG, "onResume() - Registered!");
}
从onPause处理程序中:
@Override
protected void onPause() {
// TODO Auto-generated method stub
unregisterReceiver(receiver);
Log.d(TAG, "onPause() - Unregistered!");
super.onPause();
}
从广播接收器:
private BroadcastReceiver receiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent != null && intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){
Log.d(TAG, "receiver/onReceive() - GOT THE INTENT!!!!");
}else{
Log.d(TAG, "receiver/onReceive() - NOPE! NO INTENT!");
}
mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notifyDetails = new Notification(R.drawable.icon,"Time Reset!",System.currentTimeMillis());
PendingIntent myIntent = PendingIntent.getActivity(context, 0, new Intent(Intent.ACTION_VIEW, People.CONTENT_URI), 0);
notifyDetails.setLatestEventInfo(context, "Time has been Reset", "Click on me to view Contacts", myIntent);
notifyDetails.flags |= Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
Log.i(getClass().getSimpleName(),"Sucessfully Changed Time");
}
};
此时,在以编程方式执行此操作时,从清单中删除意图接收器(我之前提到过)。 另外,定义权限!
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
对我来说,所有事情看起来都不错,除了您必须暂停“活动”就无法打开或关闭飞行模式,这会取消接收器的注册。 当您回到“活动”,继续并重新注册时,您已经错过了广播。
我不知道您的最终目标是什么,但是如果您希望您的应用接收飞行模式Intent,最好的办法是在清单中注册。 (从技术上讲,您可以动态地执行此操作,但这需要在比onResume()
/ onPause()
更永久的位置进行注册/注销,我认为这并不是您真正想要的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.