How to start a service when forced stop is clicked in android

I am facing a problem starting a service when forced stop is clicked and when I restart my mobile this service needs to be called. I have followed some examples but I cannot achieve this task. Can anyone advise me to complete the task.

Required:

1.Service should run when force stop has been clicked from settings
2.Service should run when mobile has been restarted. 

      

TestActivity.java

com.testsearching package;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        startService(new Intent(this, ServiceTest.class));
    }
}

      

ServiceTest.java

package com.testsearching;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ServiceTest extends Service {

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

    @Override
    public void onCreate() {
        super.onCreate();
        mTimer = new Timer();
        mTimer.schedule(timerTask, 2000, 2 * 1000);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {

        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    private Timer mTimer;

    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            Log.e("Log", "Running");

        }
    };

    public void onDestroy() {
        try {
            mTimer.cancel();
            timerTask.cancel();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Intent intent = new Intent("com.android.techtrainner");
        intent.putExtra("yourvalue", "torestore");
        sendBroadcast(intent);
    }
}

      

ReceiverCall.java

    package com.testsearching;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.Toast;

    public class ReceiverCall extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.i("Service Stops", "Ohhhhhhh");
            context.startService(new Intent(context, ServiceTest.class));;
            Toast.makeText(context, "My start", Toast.LENGTH_LONG).show();
            }
        }

}

      

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.testsearching"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.testsearching.TestActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".ServiceTest" >
            <intent-filter>
        <action android:name="com.testsearching.ServiceTest" />
    </intent-filter>

        </service>

        <receiver
            android:name="ReceiverCall"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
            <intent-filter>
                <action android:name="com.android.techtrainner" />
                <action android:name="android.intent.action.SCREEN_ON" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

      

+3


source to share


1 answer


In theory, this is impossible; according to the Android security model.

As Panj Kumar points out in the comments:

When the user stops, it means that he does not want to launch this application (any component). he is no longer interested, and these are user rights. SO-android does not allow your service to continue running, even after forcibly closing your application.

Android will prevent the app from restarting with a flag START_STICKY

and disable the receiver RECEIVE_BOOT_COMPLETED

. The system will also disable all alarms that have been set for this application.

Before the system can launch the application again, the user must launch Activity

the application itself.




However, it looks like some apps can still break the rules in this way. This should be considered incorrect and take advantage of the security hole, however it shows that this is possible even on KitKat.

The Discovery Insure Driving App seems to be able to restart itself when stopped and restart on boot:

However, this functionality should not be relied upon - hopefully this security flaw will be fixed in future system updates.

0


source







All Articles