2010-08-30 81 views
1

我看到多個廣播(例如ACTION_TIME_TICK)無法在清單中註冊,必須通過Context.registerReceiver()明確註冊。我在ACTION_USER_PRESENT廣播意圖中遇到問題。具體來說,我測試的模擬器和我的應用程序不斷強制關閉與錯誤:ACTION_USER_PRESENT BroadcastReceiver是否可以在清單中註冊?

08-30 09:44:23.397: ERROR/AndroidRuntime(290): java.lang.RuntimeException: Unable to start receiver me.turnerha.RegisterListeners: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 

這是由

08-30 09:44:23.397: ERROR/AndroidRuntime(290): Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 

我的表現造成相當簡單:

<receiver android:name=".RegisterListeners"> 
     <intent-filter> 
      <action android:name="android.intent.action.SCREEN_ON" /> 
     </intent-filter> 
    </receiver> 

有什麼想法?我基本上試圖創建一個在安裝應用程序後儘快喚醒的Receiver。第一次喚醒時,它會註冊一些監聽器,然後它自己註銷,以免它再次被調用。 (我真的希望在你的應用程序安裝完畢後立即啓動一個目標,以允許一些設置:))

回答

5

正確 - 無論是ACTION_SCREEN_ON還是ACTION_USER_PRESENT都不能在清單中註冊。我在這個問題上有filed a documentation bug

+2

我不知道這是否是總是如此,但'ACTION_USER_PRESENT' *可以*是在清單中註冊。它在仿真器和我的Desire Z(2.2)中都適用於我。 – 2011-07-26 08:49:59

+7

ACTION_USER_PRESENT可以在清單中註冊,只要屏幕上存在任何鎖定方式(看起來)就可以工作,包括「拖動此欄解鎖」默認設置。如果您可以通過按下電源按鈕無障礙地進入主屏幕,則在測試的情況下,該意圖似乎不會觸發。 – MattC 2012-02-08 18:39:19

+0

感謝doc錯誤,很多很好的工作...... :) – 2015-01-31 04:52:28

2

無論哪種方式,您都可以使用context.registerReceiver(),這樣做會訣竅,並保持清單清潔。 Link

+0

據我所知,這類接收器只會在您的應用程序中生存。尤其是在三星這一次可能會很短。 – JacksOnF1re 2016-05-24 13:17:24

1

在清單文件中註冊ACTION_USER_PRESENT不會始終觸發。在我的nexus4中,如果我在清單文件中註冊ACTION_USER_PRESENT,那麼它根本不起作用,而在Activity中註冊可以正常工作。

0

我有同樣的問題,我修好了(在4.3和5.1測試)。我能夠在清單中聲明「android.intent.action.USER_PRESENT」,只要你有READ_PHONE_STATE權限,那就OK!我的迷你應用程序由一個廣播接收器組成,可以響應屏幕開/關狀態,並運行連續語音識別的後臺服務。如果屏幕關閉,則關閉識別功能。下面是代碼,即可享受:清單:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <receiver android:name="classes.VoiceLaunchReceiver" > 
      <intent-filter>     
       <action android:name="android.intent.action.USER_PRESENT" />  
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </receiver> 

廣播接收器:

public class VoiceLaunchReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context ctx, Intent intent) {  
     Intent service = new Intent(ctx, VoiceLaunchService.class); 
    // service.putExtra(action, true); 
     Log.i("joscsr","Incoming Voice Launch Broadcast..."); 

     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { 
      Log.i("joshcsr", "************\nCSR Resumed (BC)\n************"); 
      ctx.startService(service); 
      } 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.i("joshcsr", "************\nCSR STOPPED by SCREEN (BC)\n************"); 
      ctx.stopService(service); 
      } 
     } 
} 

你可以想像,我USER_PRESENT廣播接收器沒有註冊任何其他地方。我在我的服務的onCreate方法中註冊了ACTION_SCREEN_OFF和ON,這是我的接收方觸發的。

@Override 
public void onCreate() { 
    super.onCreate(); 
    //Register screen ON/OFF BroadCast 
    launcher=new VoiceLaunchReceiver(); 
    IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    i.addAction(Intent.ACTION_SCREEN_ON);    
    registerReceiver(launcher,i); 
    Log.d("joshcsr","VoiceLaunch Service CREATED"); 
    } 

最後我註銷屏幕開/關中的onDestroy()我公司的服務:

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(launcher);} 
相關問題