Truecaller / Whatsapp服务说明
**注意:强制关闭意味着通过按住后退按钮来杀死应用程序,而不仅仅是停止服务管理器/应用程序管理器的服务(参见Kill app back button)。
在我打电话时杀死truecaller应用程序后,它会自动重启,对于whatsapp也是如此。在收到消息后杀死它后,它仍会显示通知并重新启动服务。这些服务也会在几次延迟后重新启动
到目前为止我做了什么来实现这个目标
我想从我的backgroundservice类的onDestroy()中创建一个这样的服务,所谓的我的backgroundservice。代码:ServiceDemo 0.1
public class BackgroundService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(BackgroundService.this, "Service Started...", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onDestroy() {
Intent intentService = new Intent(this,BackgroundService.class);
startService(intentService);
Toast.makeText(BackgroundService.this, "Service Will Be Restarted...", Toast.LENGTH_SHORT).show();
}
}
如果我从服务管理器停止服务,该服务正在重新启动。但如果我强行关闭/杀死它,它就会消失。
在此之后,我实现了广播接收器,它没有任何区别。代码:ServiceDemo 0.2
BackgroundService.java
public class BackgroundService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(BackgroundService.this, "Service Started...", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onDestroy() {
Toast.makeText(BackgroundService.this, "Service Will Be Restarted...", Toast.LENGTH_SHORT).show();
sendBroadcast(new Intent("RestartMe"));
}
}
RestartBackgroundService.java
public class RestartBackgroundService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// I have also used AlarmManager , but it doesn't make any difference for me
// AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// PendingIntent pi = PendingIntent.getService(context, 0, new Intent(context, BackgroundService.class), PendingIntent.FLAG_UPDATE_CURRENT);
// int interval = 5000;
// am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval, interval, pi);
context.startService(new Intent(context.getApplicationContext(),BackgroundService.class));
}
}
由于whatsapp正在使用gcm,所以我想如果我实现它会有所帮助。 然后我实现了firebase云消息传递(fcm)来接收推送通知,我删除了代码以从onDestroy()重新启动后台服务。
现在,如果我从服务管理器停止服务,它仍然停止,然后我从我的firebase控制台发送通知,它会在谷歌的gcm服务正在运行时收到通知。如果我点击通知,它会重新启动我的服务。
但是如果我强行关闭/杀死我的应用程序,虽然gcm服务正在运行,但没有收到任何通知。代码:(我发布了一个链接,使描述有点短)
我想要什么
我希望我的服务像whatsapp / truecaller一样持久,即使我强行关闭它。他们在经过几次延误后继续开始。我想在不使用像fcm这样的第三方的情况下实现它。
如果有人能够在特定的系统服务/应用程序(如拨号程序)启动时提供有关如何启动服务的任何提示/解决方案,那将是一个很好的帮助。