2010-10-03 169 views
28

我試圖自動啓動使用)在的onPause實施(以下BroadcastReceiver的方法充電我nightclock應用:startActivity()從廣播接收器

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

的的onReceive()方法時,會引發USB電纜是插入,但該活動未啓動。然而,日誌顯示了這一點:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

任何想法爲什麼日誌說活動已開始,但沒有任何反應?

+0

請更新您的問題,更多來自LogCat - 此行之前的幾行以及此行之後的十幾行。另外,爲什麼'FLAG_ACTIVITY_NEW_TASK'?還有,當ACTION_POWER_CONNECTED發生時,註冊此'BroadcastReceiver'的活動還在嗎? – CommonsWare 2010-10-03 13:50:23

+0

連接電源時,LogCat中沒有更多行。 'BroadcastReceiver'被註冊在它應該開始的同一個活動中。此活動仍在後臺運行(LogCat應用程序已置於前臺)。如果這個活動在任務管理器中被終止,那麼'BroadcastReceiver'似乎根本不會被觸發。這種方法是否從一開始就錯誤地自動啓動我的應用程序? – Gubbel 2010-10-03 14:47:20

回答

16

如果您的目標是您希望在發送ACTION_POWER_CONNECTED廣播時啓動NightClock,則您使用BroadcastReceiver的方法沒問題。但是,不要從活動註冊它。相反,它註冊在清單:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

然後,有你BroadcastReceiver作爲公共Java類(這裏命名OnPowerReceiver,但你可以調用它任何你想要的),並調用它startActivity()

請記住,用戶可能不希望你這樣做。除了啓動「夜鍾」之外,還有許多其他情況可用於將手機連接到電源。我虛心地建議你只是讓用戶通過主屏幕開始你的活動。

+0

我已經在'onReceive()'方法中用這個調用所說的清單中註冊了'BroadcastReceiver':'context.startActivity(new Intent(context,NightClock.class));'但是當我連接手機通電。如果我添加Log.d(this.toString(),「嘗試啓動應用程序...」),則甚至不會添加日誌條目。 – Gubbel 2010-10-03 16:02:13

+2

@Gubbel:哎呀。嘗試''。大多數情況下,他們在字符串中沒有「ACTION_」,但顯然他們在這個字符串上。 – CommonsWare 2010-10-03 16:31:40

+0

它的工作原理!謝謝。 – Gubbel 2010-10-03 16:43:05

46

你必須作爲參數傳遞給onRecieve()方法的上下文,所以只需使用:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

它的工作原理,當然你必須改變包裝和活動類名到您自己的。

+2

爲什麼downvote?這不好嗎?它幫助我+1,因爲我沒有發現這是一個糟糕的做法。 – Mafro34 2013-11-20 15:13:57

+0

@ Mafro34我只是嘗試了相同的方法,我認爲這不理想的原因是他設置的標誌。因爲除非這是你想要的(運行一項新任務),否則它可能會嚴重地擾亂你的應用程序邏輯 - 無論如何它都會與我的應用程序邏所以除非這是你想要的,否則我建議找另一種方法。 – AgentKnopf 2014-07-21 14:29:19

+5

@AgentKnopf看起來你沒有太多選擇:(從http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle %29): 「請注意,如果從Activity Context以外調用此方法,那麼Intent必須包含FLAG_ACTIVITY_NEW_TASK啓動標誌,這是因爲,不從現有的Activity啓動,不存在任何現有任務放置新的活動,因此需要將其放置在自己獨立的任務中。「 – aberaud 2016-01-13 23:22:16

-3

Docs

,因爲用戶體驗是不和諧的,不要從廣播接收機開始活動;特別是如果有多個接收器的話。相反,請考慮顯示通知。

+0

它們在許多默認應用程序(如鬧鐘和來電)中覆蓋此設置。所以,如果用戶希望這種情況發生,那就是他的電話。你的回答並不回答這個問題。 – Dpedrinha 2017-08-22 05:51:46