![](/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.