Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In android 4.4, swiping app out of recent tasks permanently kills application with its service . Any idea why?

Unlike previous versions, in 4.4, swiping app out of recent tasks permanently kills app along with its service(like force-stop) even though it's running background services. It shows 0 processes 1 service but service also doesn't work. Ideally it shouldn't kill background service, and it doesn't in versions prior to 4.3. Any idea why is it happening in 4.4?

like image 377
Vipul J Avatar asked Dec 19 '13 09:12

Vipul J


2 Answers

Got it. Its a bug in 4.4. I tried this and it worked perfectly fine(its a dirty workout though).

Just override this method -:

public void onTaskRemoved(Intent rootIntent) {
    Log.e("FLAGX : ", ServiceInfo.FLAG_STOP_WITH_TASK + "");
    Intent restartServiceIntent = new Intent(getApplicationContext(),
            this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(
            getApplicationContext(), 1, restartServiceIntent,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext()
            .getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
}
like image 106
Vipul J Avatar answered Sep 21 '22 11:09

Vipul J


From this issue Foreground service killed when receiving broadcast after acitivty swiped away in task list

Here is the solution

In the foreground service:

@Override
public void onTaskRemoved( Intent rootIntent ) {
   Intent intent = new Intent( this, DummyActivity.class );
   intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
   startActivity( intent );
}

In the manifest:

<activity
android:name=".DummyActivity"
android:theme="@android:style/Theme.NoDisplay"
android:enabled="true"
android:allowTaskReparenting="true"
android:noHistory="true"
android:excludeFromRecents="true"
android:alwaysRetainTaskState="false"
android:stateNotNeeded="true"
android:clearTaskOnLaunch="true"
android:finishOnTaskLaunch="true"
/> 

In DummyActivity.java:

public class DummyActivity extends Activity {
    @Override
    public void onCreate( Bundle icicle ) {
        super.onCreate( icicle );
        finish();
    }
}
like image 23
kalyan pvs Avatar answered Sep 21 '22 11:09

kalyan pvs