簡體   English   中英

以接受的用戶權限啟動我的Android服務

[英]Start my Android service with accepted user permissions

我有一個具體的問題,我想要一些提示。 我只需要啟動一次Android服務,就可以使用以下兩個選項:

  1. MainActivityonCreate()方法啟動服務。 這種方式的問題是,當設備在運行我的應用程序的情況下旋轉時,再次調用onCreate()方法,因為MainActivity已重新啟動,因此我不希望我的服務重新啟動。
  2. 從Android Application 啟動它。 問題是在啟動服務之前,我需要檢查用戶是否接受了某些權限。 因此,第一次在Application 類中啟動我的應用程序時,該權限尚未被接受。

閱讀本文處理配置更改我可以看到有可能避免重新啟動MainActivity但是我不知道這是否是一個好習慣。 因此,可能存在一些從Application請求用戶權限的方法

  1. onCreate用在服務生命周期被調用一次,但onStartCommand將被調用每次調用時startService

  2. 您無法在Activity上下文之外請求用戶權限。 因此,您可以運行服務,但無法執行需要許可的操作。 您可以在服務內部注冊BroadcastReceiver,以捕獲某些“許可授予”意圖。 但是,應在用戶授予權限時創建此意圖,並通過在Activity上下文中進行廣播將其發送給服務。 或者您可以改用服務命令

為了防止重新啟動服務,只需檢查MainActivity onCreate方法是否正在運行服務即可

檢查服務運行的功能:

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

之后,您只需要在onCreate方法中調用它即可:

@Override
public void onCreate(Bundle savedInstanceState) {
if(!isMyServiceRunning(MyService.class)) {
   //start your service
}
}

我不確定您為什么只希望啟動該服務的原因,但是我將嘗試建議實現此目的的替代方法。

  1. 由於您想請求用戶的權限,因此無法在應用程序類中啟動該服務。 因此,您可以啟動的唯一位置是活動類。 解決此問題的關鍵是onCreateonStartCommand方法。 如果您在清單文件中定義服務,然后多次調用Context.startService(context) ,則只要系統尚未終止該服務, onCreate將僅被調用一次。 每次調用Context.startService(context)時都會調用onStartCommand

因此,在這種方法中,請在onCreate方法中編寫一次需要執行的代碼塊。 對於所有更新,請在onStartCommand方法中執行它們。

  1. 另一個選擇是更深入地研究android體系結構組件(LiveData,LifeCycle和觀察者)

我認為處理android臭名昭著的旋轉的最好方法是使用ViewModel ViewModel設備旋轉后仍可生存時,您可以存儲一個初始設置為trueboolean liveData ,並在onCreate()觀察。 僅當觀察值是true時才啟動服務,並在啟動服務后將其設置為false 請參見以下示例,

ViewModel中

val startService = MutableLiveData<Boolean>(true)

ActivityonCreate()

viewModel.startService.observe(this, Observer {
        if (it) {
            startService()
            viewModel.startService.value = false
        }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM