Android service not restarting in lollipop

前端 未结 7 1301
借酒劲吻你
借酒劲吻你 2020-12-11 01:13

In my application, I use location based service in background. So I need to restart my service when it gets destroyed.

But I got this message in logcat

相关标签:
7条回答
  • 2020-12-11 01:51
    import android.app.Notification;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.Intent;
    import android.os.Environment;
    import android.os.IBinder;
    import android.support.v7.app.NotificationCompat;
    
    import java.io.File;
    import java.io.IOException;
    
    import activity.MainActivity;
    import activity.R;
    import fragment.MainFragment;
    
    public class MyService extends Service {
        public static final int NOTIFICATION_CODE = 1;
    
    
        @Override
        public void onCreate() {
            super.onCreate();
    
    
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            startForeground(NOTIFICATION_CODE, getNotification());
            return START_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onDestroy() {
            stopForeground(true);
            super.onDestroy();
        }
    
        @Override
        public boolean stopService(Intent name) {
            return super.stopService(name);
        }
    
    
        /**
         * Create and return a simple notification.
         */
        private Notification getNotification() {    
            Notification notification;
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setColor(getResources()
                            .getColor(R.color.material_deep_teal_500))
                    .setAutoCancel(true);
    
            notification = builder.build();
            notification.flags = Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_AUTO_CANCEL;
    
            return notification;
        }
    
    
    }
    

    You can modify this code to accomodate your needs but this is the basic structure to start foreground service. Which restarts if gets killed.

    0 讨论(0)
  • 2020-12-11 02:01

    Finally I achieved with help of Evernote JobService

    Github link - https://github.com/evernote/android-job

    Step 1: Add evernote jobservice dependency

    implementation 'com.evernote:android-job:1.3.0-alpha03'
    

    Step 2: Create DemoJobCreator.java class

    public class DemoJobCreator implements JobCreator {
    
    @Override
    @Nullable
    public Job create(@NonNull String tag) {
        switch (tag) {
            case DemoSyncJob.TAG:
                return new DemoSyncJob();
            default:
                return null;
        }
    }
    }
    

    Step 3: Create DemoSyncJob.java class

    public class DemoSyncJob extends Job {
    
    public static final String TAG = ">>>> job_demo_tag";
    
    @Override
    @NonNull
    protected Result onRunJob(Params params) {
        // run your job here
        Log.d(TAG, "onRunJob: ");
        if(!isMyServiceRunning(this.getContext(), TestService.class)){
            Intent intent=new Intent(context,TestService.class);
            context.startService(intent);
        }
        scheduleJob();
        return Job.Result.SUCCESS;
    }
    
    public static void scheduleJob() {
        new JobRequest.Builder(DemoSyncJob.TAG)
                .setExecutionWindow(2_000L, 2_000L)
                //.setPeriodic(900000) -> recommended. but it will work after 15 min (if you used this no need scheduleJob(); inside onRunJob();)
                .build()
                .schedule();
     }
    
     public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) {
        try {
            ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
                if (serviceClass.getName().equals(service.service.getClassName())) {
                    return true;
                }
            }
        }catch (Exception e){
            Log.e(TAG, "isMyServiceRunning: ",e );
        }
        return false;
      }
      }
    

    Step 4: In your Application file (If not available create it) add following line in onCreate()

     JobManager.create(this).addJobCreator(new DemoJobCreator());
    

    Step 5: Finally start JobService in your Activity

    DemoSyncJob.scheduleJob();
    

    This JobService will check service running or not (every 2 second) If service not running it will restart the service.

    Disclaimer : This may be not right solution. But it will 100% working.

    I hope it helps atleast anyone in future.

    0 讨论(0)
  • 2020-12-11 02:05

    how you check issocketalive that socket is connected or not ? if sockettimeoutexception is generated then try to on set getinputstream and getoutputstream. other issue that may be socket not closed properly. So if possible then put your socket code here

    0 讨论(0)
  • 2020-12-11 02:07

    Your code in onTaskRemoved is preventing the system to run the killProcess commands. The delay on Kitkat is caused by using alarmService.set, which is inexact from API 19. Use setExact instead.

    If you have a service that you want to keep alive, it is recommended that you attach a notification to it and make it foreground. That way the likeliness of it being killed would be lowered.

    0 讨论(0)
  • 2020-12-11 02:14

    You can restart it by using a BroadcasteReceiver which handles the broadcast sent from onDestroy() of your service.

    How to do this:

    StickyService.java

    public class StickyService extends Service
    {
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
        }
    
    
        @Override
        public void onTaskRemoved(Intent rootIntent) {
             super.onTaskRemoved(rootIntent);
             sendBroadcast(new Intent("IWillStartAuto"));
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            sendBroadcast(new Intent("IWillStartAuto"));
        }
    
    }
    

    RestartServiceReceiver.java

    public class RestartServiceReceiver extends BroadcastReceiver
    {
    
        @Override
        public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context.getApplicationContext(), StickyService.class));
    
        }
    
    }
    

    Declare the components in manifest file:

        <service android:name=".StickyService" >
        </service>
    
        <receiver android:name=".RestartServiceReceiver" >
            <intent-filter>
                <action android:name="IWillStartAuto" >
                </action>
            </intent-filter>
        </receiver>
    

    Hope this will help you.

    0 讨论(0)
  • 2020-12-11 02:16

    this worked for me

    Add this attribute in android:allowBackup="false" in manifest file in application tag.

     <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
    <application
        android:allowBackup="false"
        tools:replace="android:allowBackup">
    
    </application>
    </manifest>
    
    0 讨论(0)
提交回复
热议问题