简体   繁体   English

无法动态注册广播接收器

[英]Not able to register Broadcast receiver Dynamically

I am registering my reciver in OnResume and unregistering in OnPause is Something is wrong with my code 我正在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");
    }

   }; 



   }

////////MANIFEST FILE ////////清单文件

 <?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>

I am not getting my notification. 我没有收到通知。 If I'm doing this statically then it works 如果我是静态地执行此操作

Edit #3: Define global variable: 编辑#3:定义全局变量:

private IntentFilter mIntentFilter;

From the onCreate handler: 从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);
}

From the onResume handler: 从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!");
}

From the onPause handler: 从onPause处理程序中:

@Override
protected void onPause() {
   // TODO Auto-generated method stub
   unregisterReceiver(receiver);
   Log.d(TAG, "onPause() - Unregistered!");
   super.onPause();
}

From the broadcast receiver: 从广播接收器:

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");
    }

   };

At this point, remove the intent receiver (that I mentioned earlier) from the manifest as we're doing this programmatically. 此时,在以编程方式执行此操作时,从清单中删除意图接收器(我之前提到过)。 Also, define the permission! 另外,定义权限!

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Everything looks good to me other than the fact that you can't turn airplane mode on or off without pausing your Activity, which unregisters your receiver. 对我来说,所有事情看起来都不错,除了您必须暂停“活动”就无法打开或关闭飞行模式,这会取消接收器的注册。 By the time you get back to your Activity, resuming and re-registering, you've missed the broadcast. 当您回到“活动”,继续并重新注册时,您已经错过了广播。

I have no idea what your ultimate goal is here, but if you want your app to receive the airplane mode Intent, the best idea is to register in your manifest. 我不知道您的最终目标是什么,但是如果您希望您的应用接收飞行模式Intent,最好的办法是在清单中注册。 (Technically you can do it dynamically, but that would require doing the registration/unregistration somewhere more permanent than onResume() / onPause() which I don't think is really what you want.) (从技术上讲,您可以动态地执行此操作,但这需要在比onResume() / onPause()更永久的位置进行注册/注销,我认为这并不是您真正想要的。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM