OnTask在Android O中已移除

时间:2018-08-29 13:57:40

标签: android xamarin service android-8.1-oreo jobservice

在我的Android应用中,我有一个Service,该应用在后台运行时启动。 OnStartCommand开始长期运行的任务,该任务分析并检查设备和应用程序的状态。

现在,我正在为Android O准备应用程序。我遇到的第一个问题是Services,我将它们重做为JobServices

现在我面临另一个问题。当用户从应用程序堆栈JobService.OnTaskRemoved中删除我的应用程序时,不会被调用。

之前,当我使用Service时,对Service.OnTaskRemoved的调用对我来说效果很好。

现在我只能看到办法。我需要我的旧Service来处理Service.OnTaskRemoved,需要新的JobServices来执行任务。

我错了吗?也许有人可以给我很好的建议?

1 个答案:

答案 0 :(得分:3)

您实施的是错误的概念..,这会产生问题..,要解决它..您再次实施的是错误的事情..请卸载所有...

  

在我的android应用中,我有一个服务,该服务会在该应用进入后台时启动。

问题;

  1. 在android O中根本不允许后台执行..即使是一行代码也不能保证执行.. !!
  2. 您希望它执行长期运行的服务.. !!

解决方案;

每次首次打开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开始长期运行的任务,该任务分析并检查设备和应用程序的状态。

问题;

  1. OnStartCommand并不是要编码长时间运行的过程/代码语句。
  2. 也不会被编码........

解决方案;

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.d("RUNNER : ", "\nPERFORMING....");
    return START_STICKY;
}

单行以上告诉android,请保持生存状态。开发人员必须始终通过代码停止来停止它,甚至从backgroundrecents中删除;它会由android os自动重新创建

  

那我应该在哪里写代码... ??

等等...现在还为时过早.... !!!耐心

  

开始长期运行的任务,该任务分析检查设备应用状态

您的问题尚不清楚,并且在我的大脑中存在gradle错误... I can not resolve your symbols

  1. 分析
  2. 检查设备
  3. 应用状态

但是我知道这些绝对是您的广播..并且您需要实现广播接收器...才能接收它... !!

  

我将实现广播接收器...太简单了...

问题;

等等... 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调用其在开始时给出的代码即可!!!

  

那么我长期运行的代码在哪里?... ???

从接收器接收所需的广播,然后启动intentservicejob或警报类或您想要的任何内容...

  

我将创建一个简单的类,该类在构造函数中使用context并定义一个名为LongRunningCode的公共方法,该方法可能只有一千万行代码。   在接收器中接收广播时,我将通过传递接收器context来创建该类的对象,并简单地用该LongRunningCode调用object方法

希望有帮助