2014-07-05 37 views
1

我有一個鬧鐘應用程序正在製作。我有一個用戶設置鬧鐘時間的活動。這使用AlarmManager註冊了我在報警發生時接收廣播的廣播接收機類別。然後我在接收器onReceive()中開始一項新的活動。當第二個活動開始時,鬧鐘聲音在onStart()中播放。我如何判斷我的活動是由接收者開始的,還是用戶只是在應用程序中進行多任務處理?當用戶使鬧鐘靜音,按下主頁按鈕,然後租用應用程序(同時仍在進行聲音播放活動時)時,我不希望播放聲音。如何判斷我的活動是否由廣播接收機啓動?

+2

難道你不能把你發送到'onReceive()'方法的意圖額外? – joao2fast4u

+0

如何在接收者的onReceive()中創建用於啓動活動#2的目的的附加內容?那麼如果意圖有額外的話,我可以播放聲音,或者當下次有人再次開始第二次活動時,那些額外的聲音還會在那裏嗎? –

+0

我不認爲它仍然會在那裏。嘗試這種方法。 – joao2fast4u

回答

8

只是通過你在onReceive()方法使用的意圖增派:

Intent intent = new Intent(this, NextActivity.class); 
intent.putExtras("playSound", true); 

「聲音播放」活動,你在播放聲音onCreate()

boolean playSound = getIntent().getBooleanExtra("playSound", false); 

如果intent-extra「playSound」不存在或設置爲false,則返回false;如果設置爲true,則返回true。


onCreate()只調用一次(在活動開始時),而onStart()被調用每次用戶重新進入您的活動(即通過最近的應用程序)。您可以在生命週期中看到這一點: android activity lifecycle

暫停被調用時的東西吸引了你的活動(例如,低電池對話框),停止被稱爲如果「退出」您的應用程序(例如,通過家庭 - 按鈕)。

0

您可以如下操作:

  1. 對於每個報警用戶設置,你把一個布爾標誌sharedpreference爲true。例如。你有三個警報,然後在sharedpreference中,你將有3個標誌。
  2. 現在假設接收到報警1的報警廣播並啓動活動2。
  3. 現在在activity2中,您首先檢查的是您在sharedpreference中設置的alarm1標誌是true還是false,如果是true play聲音。
  4. 當用戶使鬧鐘靜音或按Home鍵時,您可以將此標誌標記爲false,所以下次用戶從後臺開始活動時,sharedpreference中的標誌將爲false,並且不會播放聲音。

同樣的事情,你可以使用sqlite數據庫,通過在sqlite數據庫表中設置標誌而不是sharedpreference。

0

對於用於啓動聲音播放活動的意圖,請使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS標誌。所以如果用戶離開活動,它不能恢復。

Intent intent = new Intent(context, SoundActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 

或在清單

<activity 
     android:name="SoundActivity" 
     android:excludeFromRecents="true" > 
</activity> 
+0

儘管這是一種黑客攻擊,但爲了避免技術上的後果,可以通過其他答案中的建議修復一些額外的技術問題。 –

+0

是的。但是,如果用戶將鬧鐘作爲鬧鐘提供,一般情況下鬧鐘活動或SoundActivity不再需要,一旦用戶解除鬧鐘。對於貪睡,人們可以有一個固定的短時間間隔的另一個警報。應用程序的其他活動仍會顯示在最後。 –

2

開始一個活動或服務等,根據收到的廣播,然後你需要一個獨立的廣播接收器,你把它放在你的android清單文件中。如果您希望自己的活動本身對廣播做出響應,那麼您可以在活動中創建一個廣播接收器的實例並將其註冊到那裏。

public class BRActivity extends Activity { 
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     .................. 
     .................. 
    } 
}; 

public void onResume() { 
    super.onResume(); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(BROADCAST_ACTION); 

    this.registerReceiver(this.broadcastReceiver , filter); 
} 

public void onPause() { 
    super.onPause(); 

    this.unregisterReceiver(this.broadcastReceiver); 
} 

}

所以,這種方式創建的類時(也可以做的onCreate)接收器被實例化。然後在onResume/onPause處理註冊和取消註冊接收器。然後,在接收者的onReceive方法中,我會做任何必要的事情來使活動以我想要的方式在接收廣播時作出反應。

0

有幾個解決方案:

(1)一種方法是使用一個單獨的類可跨活動共享。 在此方法中,在BroadcastReceiver中設置Singleton類的布爾標誌,然後檢查播放聲音的活動(從BroadcastReceiver觸發)中的該標誌。如果已設置,請重置標誌。此解決方案假定廣播接收器是您的Android應用程序包的一部分。您也可以在從BroadcastReceiver啓動活動時使用Intet.putExtra(「Key」,Value)方法。您可以在從BroadcastReceiver開始的活動中檢查此密鑰,以瞭解誰啓動了此活動。

因此,這將負責檢測你來自哪裏。

如果您只是試圖設置單一警報,則創建另一個播放聲音的活動即可。如果您設置重複鬧鐘(鬧鐘以多個間隔播放),我不確定您的應用程序的行爲。

我更喜歡在廣播接收機本身(在清單中註冊爲遠程接收機)播放給定鬧鐘的指定持續時間(如30秒的聲音或者可以要求用戶配置它)。 因此,您可以使用相同的BroadcastReceiver播放單次發射聲音&多次重複報警。 我將使用相同的PendingIntent設置單次和多次重複警報。

0

這是查找應用程序是否通過廣播接收器啓動的代碼。

public class AlarmReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

    String AlarmTriggerString = (String)intent.getSerializableExtra("AlarmTrigger"); 
    Intent i = new Intent(); 
    i.setClassName("com.prasath.viki.bot","com.prasath.viki.bot.MainActivity"); 
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.putExtra("FromBroacastReceiver",true); 
    i.putExtra("AlarmTrigger",AlarmTriggerString); 
    context.startActivity(i); 

    } 
} 


protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    boolean FromReceiver = (boolean)getIntent().getSerializableExtra("FromBroacastReceiver"); 
    String AlarmTriggerString = (String) getIntent().getSerializableExtra("AlarmTrigger"); 
    if(AlarmTriggerString != null && FromReceiver != null && FromReceiver == true) 
    { 
     // do something 
    } 
} 
0

您可以簡單地設置標誌或意向,將決定什麼是你在該類目的的任何值..

對於防爆:對於播放聲音的意圖布爾值設置爲TRUE,送過來一樣在使用類包..

否則

設置該布爾值FALSE如果從其他類開始報警類別。