Android服务正在停止而不调用ondestroy

时间:2016-04-16 20:32:19

标签: android

我使用以下功能每隔三分钟调用一次服务:

   public void RunBackgroundService() {
        final Handler service_handler = new Handler();

        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                service_handler.post(new Runnable() {
                    public void run() {
                        context.startService(new Intent(context,BackgroundService.class));
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, 180 * 1000);
    }

这是我的服务,我正在发送通知:

public class BackgroundService extends Service {


    Helper helper;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCreate() {
        //Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onDestroy() {
        //Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
    }


    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void onStart(Intent intent, int startid)
    {
        helper=new Helper(this);
       // Log.d("Service started at:", helper.getdatetime());

        Intent n_intent = new Intent(this, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, n_intent, 0);

// build notification
// the addAction re-use the same intent to keep the example short
        long[] vibrate = { 0, 100, 200, 300 };
        Notification n  = new Notification.Builder(this)
                .setContentTitle("Application")
                .setContentText("This is a test")
                .setSmallIcon(R.drawable.notification_icon)
                .setContentIntent(pIntent)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setVibrate(vibrate)
                .setAutoCancel(true)
                .build();


        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(0, n);
    }
}

当应用程序崩溃服务停止时,保持服务一直运行对我来说非常重要。如何防止服务停止?

3 个答案:

答案 0 :(得分:0)

当应用程序崩溃时,整个过程都会随之崩溃。这包括该过程中的所有服务和其他线程。你不能阻止这种情况发生。

您可以做的最好的事情是将您的应用配置为在与主应用程序流程不同的流程中运行,但是您必须知道这会如何影响您应用的其余部分。

请务必read the docs了解如何定义要在其他进程中运行的服务。你使用android:process属性。

答案 1 :(得分:0)

您不能停止系统查杀您的服务。但是,您可以做的是在崩溃时重新启动服务。看一下详细的帖子How to restart service after the app is killed from recent。此解决方案不仅可以在应用程序被用户通过最近的设备杀死时使用,而且还可以在系统杀死应用程序时使用。

答案 2 :(得分:0)

使用android:process标签在不同的进程中启动进程。

然后使用它作为绑定到您的应用程序的服务,这样您就可以通过ipc与服务进行通信,并且即使您的应用程序崩溃,服务也会无限期地运行。