我一直在从事需要持续运行后台服务的项目。
我的代码在 Android O和Lollipop设备上运行正常。
但是我在使用棉花糖设备时遇到了问题。当用户杀死该应用程序时,我的服务停止了。
代码
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));
}
任何人都可以指导我在棉花糖中永无止境的服务的最佳体验和解决方案吗?
我也想通过我的应用为用户提供最佳体验
我们将为您提供帮助
谢谢
答案 0 :(得分:1)
仅当未明确停止服务时,该服务才会重新启动或继续运行。就您而言-您将在
中停止@Override protected void onDestroy() { stopService(mServiceIntent); Log.i("MAINACT", "onDestroy!"); super.onDestroy(); }
只需从活动中删除onDestroy()方法即可。