您正在实施错误的概念..,这会产生问题..,要解决它..您再次实施错误的事情..请卸载所有...
在我的 android 应用程序中,我有一个在应用程序进入后台时启动的服务。
问题 ;
- 在android O中根本不允许后台执行..即使是单行代码也不能保证执行..!!
- 并且您希望它执行长时间运行的服务..!!
解决方案;
每当第一次打开应用程序时,都可以启动相同的服务......获取所有运行时权限。作为 :
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
开始长期运行的任务,分析和检查设备和应用程序状态。
问题 ;
- OnStartCommand 并不意味着对长时间运行的过程/代码语句进行编码..
- 也根本不是要编码的…………
解决方案;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.d("RUNNER : ", "\nPERFORMING....");
return START_STICKY;
}
上面的单行告诉 android 一直保持活动状态,直到开发人员通过自己的代码 STOPSELF 停止它,甚至从background
或从recents
; 它由android os自动重新创建
那我应该在哪里写代码.... ??
等等……现在写代码还为时过早……!!!耐心
开始长时间运行的任务,分析和检查设备和应用程序状态
你的问题不清楚,在我的脑海里有一个 gradle 错误...... I can not resolve your symbols
:
- 分析
- 检查设备
- 应用状态
但我知道这些你的广播绝对是..而且你需要实现广播接收器......接收它......!!
我将实现广播接收器......它太容易了......
问题 ;
等等...Android O 不允许您像我们一样从静态接收器实现许多广播接收器...甚至我们也不允许在 manifest.xml 中的特定意图操作上调用这些接收器
解决方案;
在您上面创建的服务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
希望能帮助到你