![](/img/trans.png)
[英]Facebook SDK, How do I check if a user has accepted my permissions?
[英]Start my Android service with accepted user permissions
我有一個具體的問題,我想要一些提示。 我只需要啟動一次Android服務,就可以使用以下兩個選項:
MainActivity
的onCreate()
方法啟動服務。 這種方式的問題是,當設備在運行我的應用程序的情況下旋轉時,再次調用onCreate()
方法,因為MainActivity
已重新啟動,因此我不希望我的服務重新啟動。 Application
類啟動它。 問題是在啟動服務之前,我需要檢查用戶是否接受了某些權限。 因此,第一次在Application
類中啟動我的應用程序時,該權限尚未被接受。 閱讀本文處理配置更改我可以看到有可能避免重新啟動MainActivity
但是我不知道這是否是一個好習慣。 因此,可能存在一些從Application
請求用戶權限的方法
onCreate
用在服務生命周期被調用一次,但onStartCommand
將被調用每次調用時startService
您無法在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
}
}
我不確定您為什么只希望啟動該服務的原因,但是我將嘗試建議實現此目的的替代方法。
onCreate
和onStartCommand
方法。 如果您在清單文件中定義服務,然后多次調用Context.startService(context)
,則只要系統尚未終止該服務, onCreate
將僅被調用一次。 每次調用Context.startService(context)
時都會調用onStartCommand
。 因此,在這種方法中,請在onCreate
方法中編寫一次需要執行的代碼塊。 對於所有更新,請在onStartCommand
方法中執行它們。
我認為處理android臭名昭著的旋轉的最好方法是使用ViewModel
。 當ViewModel
設備旋轉后仍可生存時,您可以存儲一個初始設置為true
的boolean
liveData
,並在onCreate()
觀察。 僅當觀察值是true
時才啟動服務,並在啟動服務后將其設置為false
。 請參見以下示例,
在ViewModel中
val startService = MutableLiveData<Boolean>(true)
在Activity的onCreate()
viewModel.startService.observe(this, Observer {
if (it) {
startService()
viewModel.startService.value = false
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.