提兵百万西湖上,立马吴山第一峰!这篇文章主要讲述永远不会结束marshmallow android的后台服务相关的知识,希望能为你提供帮助。
我一直致力于我需要不断运行后台服务的项目。
我的代码在android O和Lollipop设备上运行良好。但我遇到了Marshmallow设备的问题。当用户杀死应用程序时,我的服务已停止。
我读过和Optimize for Doze and App Standby码
main activity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pingService = new PingService(this);
mServiceIntent = new Intent(this, PingService.class);
if (!isMyServiceRunning(PingService.class)) {
startService(mServiceIntent);
}}private boolean isMyServiceRunning(Class<
?>
serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
Log.i ("isMyServiceRunning?", true+"");
return true;
}
}
Log.i ("isMyServiceRunning?", false+"");
return false;
}@Override
protected void onDestroy() {
stopService(mServiceIntent);
Log.i("MAINACT", "onDestroy!");
super.onDestroy();
}
ping service.Java
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >
= Build.VERSION_CODES.O )
startMyOwnForeground();
else if(Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
Log.i("onCreate","Innn");
startMyOwnForeground();
}else{
Log.i("onCreate","in start Forground");
startForeground(1, new Notification());
}}private void startMyOwnForeground(){
String NOTIFICATION_CHANNEL_ID = "com.example.simpleapp";
String channelName = "My Background Service";
NotificationChannel chan = null;
if (android.os.Build.VERSION.SDK_INT >
= android.os.Build.VERSION_CODES.O) {
chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle("App is running in background")
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(2, notification);
}}@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.i("onStartCommand","in onStartCommand");
startTimer();
return START_STICKY;
}public PingService(Context context) {
this.context = context;
}@Override
public IBinder onBind(Intent intent) {
return null;
}public void startTimer() {
Log.i("startTimer","startTimer");
//set a new Timer
timer = new Timer();
//initialize the TimerTask's job
initializeTimerTask();
//schedule the timer, to wake up every 1 second
timer.schedule(timerTask, 1000, 1000);
//
}/**
* it sets the timer to print the counter every x seconds
*/
public void initializeTimerTask() {
timerTask = new TimerTask() {
public void run() {
Log.i("in timer", "in timer ++++"+ (counter++));
}
};
}/**
* not needed
*/
public void stoptimertask() {
//stop the timer, if it's not already null
if (timer != null) {
timer.cancel();
timer = null;
}
}@Override
public void onDestroy() {
super.onDestroy();
Log.i("EXIT", "ondestroy!");
Intent broadcastIntent = new Intent(this, RestarterBroadcast.class);
sendBroadcast(broadcastIntent);
stoptimertask();
}
restart而B rod cast.Java
@Override
public void onReceive(Context context, Intent intent) {
Log.i(RestarterBroadcast.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");
if (Build.VERSION.SDK_INT >
= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, PingService.class));
} else {
Log.i(RestarterBroadcast.class.getSimpleName(), "In");
context.startService(new Intent(context, PingService.class));
}
//context.startService(new Intent(context, PingService.class));
}
任何人都可以指导我在Marshmallow的永无止境的服务的最佳体验和解决方案吗?
我还想从我的应用程序中为用户提供最佳体验
帮助将不胜感激
【永远不会结束marshmallow android的后台服务】谢谢
答案服务将重新启动或仅在未明确停止的情况下继续工作。在你的情况下 - 你正在阻止它
@Override protected void onDestroy() { stopService(mServiceIntent);
Log.i("MAINACT", "onDestroy!");
super.onDestroy();
}
只需从活动中删除onDestroy()方法即可。
推荐阅读
- Android Studio Databinding(我可以在onKey事件中访问绑定的内容吗())
- 如何解决android中的版本冲突错误()
- 在android中无限运行服务
- 在所有版本的android中以任何模式保持服务活着
- Android,前台服务让app保持活力吗()
- android中的后台服务没有运行像oppo,vivo等设备
- Android服务重新创建
- 我的春季启动webapp.war停止在ssh注销上运行。如何创建应用服务,以便在没有用户登录的情况下运行
- 在开机或重启设备时启动Android服务[重复]