想要像Whatsapp / Truecaller那样提供持久的服务

时间:2016-09-25 11:44:30

标签: android service

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服务正在运行,但没有收到任何通知。代码:(我发布了一个链接,使描述有点短)

ServiceDemo 0.3

我想要什么

我希望我的服务像whatsapp / truecaller一样持久,即使我强行关闭它。他们在经过几次延误后继续开始。我想在不使用像fcm这样的第三方的情况下实现它。

如果有人能够在特定的系统服务/应用程序(如拨号程序)启动时提供有关如何启动服务的任何提示/解决方案,那将是一个很好的帮助。

0 个答案:

没有答案