在我的Android应用中,我有一个Service
,该应用在后台运行时启动。 OnStartCommand
开始长期运行的任务,该任务分析并检查设备和应用程序的状态。
现在,我正在为Android O准备应用程序。我遇到的第一个问题是Services
,我将它们重做为JobServices
。
现在我面临另一个问题。当用户从应用程序堆栈JobService.OnTaskRemoved
中删除我的应用程序时,不会被调用。
之前,当我使用Service
时,对Service.OnTaskRemoved
的调用对我来说效果很好。
现在我只能看到办法。我需要我的旧Service
来处理Service.OnTaskRemoved
,需要新的JobServices
来执行任务。
我错了吗?也许有人可以给我很好的建议?
答案 0 :(得分:3)
您实施的是错误的概念..,这会产生问题..,要解决它..您再次实施的是错误的事情..请卸载所有...
在我的android应用中,我有一个服务,该服务会在该应用进入后台时启动。
每次首次打开App时都可以启动相同的服务...获取所有运行时权限后。为:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
context.startForegroundService(new Intent(context, YourLongRunningService.class));
}
else
{
context.startService(new Intent(context, YourLongRunningService.class));
}
OnStartCommand
开始长期运行的任务,该任务分析并检查设备和应用程序的状态。
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.d("RUNNER : ", "\nPERFORMING....");
return START_STICKY;
}
单行以上告诉android,请保持生存状态。开发人员必须始终通过代码停止来停止它,甚至从background
或recents
中删除;它会由android os自动重新创建
那我应该在哪里写代码... ??
等等...现在还为时过早.... !!!耐心
开始长期运行的任务,该任务分析并检查设备和应用状态
您的问题尚不清楚,并且在我的大脑中存在gradle错误... I can not resolve your symbols
:
但是我知道这些绝对是您的广播..并且您需要实现广播接收器...才能接收它... !!
我将实现广播接收器...太简单了...
等等... Android O不允许像我们一样从静态接收器实现许多广播接收器...而且甚至不允许我们根据manifest.xml中的特定intent-action调用接收器
在上述YourLongRunningService
中的上述创建的服务onCreate
中实现运行时接收器,如:
IntentFilter myFilter = new IntentFilter();
myFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(mCallBroadcastReceiver, CallFilter);
CONNECTIVITY_CHANGE是一个示例,这是您要听的意图动作/广播...!
什么是
mCallBroadcastReceiver
和所有...
这些是接收者的运行时注册...,需要像这样从onDestroy
取消注册:
@Override
public void onDestroy()
{
this.unregisterReceiver(mCallBroadcastReceiver);
super.onDestroy();
}
不。。不。不。。我不想注销它。。。我希望它一直有效。.
我们的服务是START_STICKY
,即使它被销毁了;会自动启动,并在mCallBroadcastReceiver
中再次注册onCreate
。
那么接收者在哪里。...???
在这种情况下,mCallBroadcastReceiver
是在类区域中定义的接收方,我们在其中声明变量和常量:
public class YourLongRunningService extends Service
{
NotificationManager mNotifyManager;
NotificationCompat.Builder mBuilder;
NotificationChannel notificationChannel;
String NOTIFICATION_CHANNEL_ID = "1";
private BroadcastReceiver mCallBroadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
// All your receiver code goes here...
}
};
// your constructor
// your onStartcommand
// your ondestroy
}
这里的通知管理器正在做什么......
在O中及以上,如果没有正确的Ongoing
任务通知,您将无法运行前台服务...它将进入您的onCreate
,它将通过通知调用Startforeground将该服务作为前台服务启动
android O ...下面是什么?
它也可以在Android O下运行...只需使用普通的startservice调用其在开始时给出的代码即可!!!
那么我长期运行的代码在哪里?... ???
从接收器接收所需的广播,然后启动intentservice
或job
或警报类或您想要的任何内容...
我将创建一个简单的类,该类在构造函数中使用
context
并定义一个名为LongRunningCode
的公共方法,该方法可能只有一千万行代码。 在接收器中接收广播时,我将通过传递接收器context
来创建该类的对象,并简单地用该LongRunningCode
调用object
方法
希望有帮助