2014-01-29 37 views
1

我想捕获使用BroadcastReceiver的ACTION_SHUTDOWN和BOOT_COMPLETE。 但事实证明,这两个信号从来没有触发BroadcastReceiver(我没有看到logcat上的任何日志)。 这是我的源代码。BOOT_COMPLETE和ACTION_SHUTDOWN永远不会调用BroadcastReceiver

我给的清单

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

允许我尝试这两种方式

protected void onCreate(Bundle savedInstanceState) 
{ 
    registerReceiver(BootReceiver, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); 
    registerReceiver(ShutDownReceiver, new IntentFilter(Intent.ACTION_SHUTDOWN)); 
} 

<receiver android:name=".BootReceiver" 
      android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
</receiver> 

和BootReceiver和ShutDownReceiver源代码注册的BroadcastReceiver如

private BroadcastReceiver BootReceiver = new BroadcastReceiver() 
{ 
    private String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(ACTION_BOOT)){ 
      //my stuff 
      Log.d("Power", "Boot Complete"); 
     } 
    } 
}; 

private BroadcastReceiver ShutDownReceiver = new BroadcastReceiver() 
{ 
    private String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(ACTION_SHUTDOWN)) { 
      //my stuff 
      Log.d("Power", "Shutdown Complete"); 
     } 
    } 
}; 

也,我取消注册onDestroy中的两个BoradcastReceiver

public void onDestroy() 
{ 
    unregisterReceiver(BootReceiver); 
    unregisterReceiver(ShutDownReceiver); 
    super.onDestroy(); 
} 

有人知道我的代码有什么问题吗? 还是我想念的东西?谢谢。

回答

4

我发现它为什么不起作用。 由于我使用的是HTC设备,因此广播消息与其他设备不同。

  1. 关闭事件广播 “com.htc.intent.action.QUICKBOOT_POWEROFF
  2. 重新启动(重启)事件广播的事件广播 “com.htc.intent.action.QUICKBOOT_POWERON

在其他设备 “android.intent.action.ACTION_SHUTDOWN

  • 电源,关闭设备时,它可能会播出“android.intent.action.QUICKBOOT_POWEROFF”。

  • +0

    你如何了解HTC的具体意图?我正在与micromax合作吗?感谢您的回答 – Ajay

    +0

    更安全的写法如下: private final String ACTION_SHUTDOWN =“ACTION_SHUTDOWN”; intent.getAction()。contains(ACTION_SHUTDOWN) –

    0

    很可能您的应用程序尚未添加到“BOOT_COMPLETED”可能的接收器列表中,从Android 3.1开始,为了获得“BOOT_COMPLETED”操作,您的应用程序必须已由用户明确启动,可以显示一个活动或另一个组件,直到那时你的应用程序不会收到你所期望的广播,这一点很重要,要知道如果你“强制关闭”应用程序,它将会再次丢失广播,所以,尝试打开一个活动,然后重启你的设备,你会得到它...

    希望这有助于!

    问候!

    +0

    谢谢您的回答。我自己激活了Acitivity,然后重新启动我的设备。结果是一样的。 – iscnorthwind

    +0

    看看CommonsWare的答案,你必须让你的Receiver在清单中声明,以便在应用程序没有完全运行的情况下侦听广播,在你的代码中你的registerReceiver方法永远不会被执行...... –

    0

    试试这个。

    <receiver 
          android:name="packagename.GPSReceiver" 
          android:enabled="true" 
          android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
          <intent-filter android:priority="500" > 
           <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    
           <category android:name="android.intent.category.DEFAULT" /> 
          </intent-filter> 
         </receiver> 
    
    +0

    AFAIK,'android:permission'元素不管用。 – CommonsWare

    0

    BOOT_COMPLETED必须在清单中注册。您无法通过registerReceiver()进行注册,因为在您拨打registerReceiver()时,启动早已发生。

    AFAIK关机广播与registerReceiver()一起使用,但在您的情况下它只会在您的进程运行时才会出现。

    +0

    关闭设备时,我也看不到任何日志。你有什么主意吗?谢谢 – iscnorthwind

    +0

    @ user3138776:我从来没有试过使用'ACTION_SHUTDOWN',所以我不知道会发生什么。确保你真正关闭了设备,但ACTION_SHUTDOWN不仅仅是关闭屏幕(ACTION_SCREEN_OFF)。 – CommonsWare

    相关问题