gpt4 book ai didi

android - 棉花糖安卓中永无止境的后台服务

转载 作者:行者123 更新时间:2023-11-29 23:13:33 25 4
gpt4 key购买 nike

我一直在从事需要持续运行后台服务的项目。

My Code is working fine on Android O and Lollipop devices.

但我在使用 Marshmallow 设备时遇到了问题。当用户终止应用程序时,我的服务停止。

i have read about and Optimize for Doze and App Standby

代码

MainActivity.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();
}

PingService.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();

}

RestarterBrodcast.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));
}

任何人都可以指导我在棉花糖中永无止境的服务的最佳体验和解决方案吗?

我还想通过我的应用为用户提供最佳体验

帮助将不胜感激

谢谢

最佳答案

只有在未明确停止服务时,服务才会重新启动或继续工作。在你的情况下 - 你在

@Override protected void onDestroy() { stopService(mServiceIntent); Log.i("MAINACT", "onDestroy!"); super.onDestroy(); }

只需从 Activity 中删除 onDestroy() 方法即可。

关于android - 棉花糖安卓中永无止境的后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55672966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com