2017-07-22 24 views
0

我跑遍了一段時間,但使用啓動的服務......或者說,不使用綁定服務時無法找到任何信息,最後調用()。有很多關於綁定服務的信息,但是我已經有了兩個非常大的「啓動服務」而沒有綁定,所以我不想修改現有的服務。Android的工作室 - 用服務調用最終()與FLAG_ACTIVITY_NEW_TASK

我的應用程序的工作原理是閱讀每10秒藍牙數據,並根據數據讀取時,服務將變成一個新的活動。但是,我無法從我的服務中調用final(),所以我擔心在應用程序/服務運行時可能無休止地堆疊活動。

要更改活動,我必須添加Intent.FLAG_ACTIVITY_NEW_TASK。考慮到開發人員頁面中的以下圖像/定義,此標誌看起來好像可能已經處理了我的堆疊問題?我不允許用戶使用手機上的後退按鈕,因爲通過確認/取消按鈕和服務處理所有事情。我的應用程序必須是這樣,有幾個原因。因此,保持堆棧順序對我的應用程序並不重要。

enter image description here

要點 -

  • 我要確保我不會無休止地疊加起來活動開始新的活動
  • 通過我的服務開始活動時,翹邊「新任務」的時候
  • 堆棧順序對我的應用程序並不重要

下面是我的代碼的一個非常小的剪輯與評論來解釋我想要做什麼。請確保查看此服務的onDestroy()方法。

public class AlertService extends Service { 

    final class Threader implements Runnable{ 
     // Scans bluetooth advertisement packets every 10 seconds 
     // Thread Runs until interrupted 
     // Stops service via service ID 
     stopSelf(this.serviceID); 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
    } 

    // Runs a thread until alert is found. 
    // Alert calls thread.interrupt() 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startID){ 
     enableBluetooth(); 

     // Start Thread 
     thread = new Thread(new Threader(startID)); 
     thread.start(); 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy(){ 
     thread.interrupt(); 
     Intent alertActivity = new Intent(this, AlertActivity.class) 
     alertActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(alertActivity); 
    } 

    // Unused Method - We will not be binding 
    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

通過推薦編輯使用Android:taskAffinity - 採用Android:taskAffinity不會幫助我在這種情況下。默認情況下,應用程序中的所有活動都具有相同的關聯性。當我在意圖標誌設置Intent.FLAG_ACTIVITY_NEW_TASK創建一個新的任務,新的活動將仍然是在同一個任務開始,如果該活動在任務根系活力相同taskAffinity。由於我只是使用默認親和力,所有東西都應該有正常的堆棧流。我只是不能打電話給finish(),這意味着我正在堆疊大量的活動。

+0

您是否總是希望在背面堆疊上只有一個AlertActivity? – Sunhee

+0

@Sunhee應用程序以「家庭服務」運行開始。當發現警報時,Home Service將停止,並隨着啓動「警報服務」一起創建新的活動。但是,警報服務期間可能會創建許多活動。通常情況下,警報屏幕發出警報,但會創建一個新的活動以定期更新。稍後,會發出「全部清除」信息,結束警報服務並重新啓動家庭服務和家庭活動。 – FoxDonut

+0

如果您只想啓動一個AlertActivity,則必須在Manifest.xml上將android:taskAffinity和android:excludeFromRecents設置爲AlertActivity。 **但**,請向我展示您的資源,Home Service停止後創建的活動源和AlertActivity源? – Sunhee

回答

0

要回答我自己的問題,通過Intent.FLAG_ACTIVITY_NEW_TASK調用的每個新活動都創建了每個活動的新實例並將其放入堆棧。這是真的。但是,每項活動都沒有制定新的任務,這也是我的擔心之一。

當我通過在意向標誌中設置Intent.FLAG_ACTIVITY_NEW_TASK創建新任務時,如果新活動具有相同的taskAffinity根活動,則新活動仍將在同一任務中啓動(不在新任務中)在任務中。由於我只是使用默認關聯,因此我創建的每個活動都被放入相同的任務中。這意味着沒有什麼比創建活動等的正常流程有任何不同。

儘管由於我禁用了我的應用程序的後退按鈕,因此通過標記新任務創建的這些活動並未完成,銷燬或從堆棧中移除。爲了解決這個問題,我將使用FLAG_ACTIVITY_CLEAR_TOP,它在堆棧中找到一個正在運行的活動實例(如果有的話)並關閉它上面的所有活動。

由於我的應用程序總是從主屏幕開始,然後以主屏幕結束,標記爲「清除頂部」將始終關閉主屏幕上方的所有活動。所以,回到主屏幕後,堆棧中唯一的項目將成爲主屏幕。

我將不得不測試這個,但似乎我不會從我的家庭活動調用finish()來實現此結果 - 否則,在返回到家庭活動時,並非所有堆棧都會被清除。

enter image description here