0

I try to make an Android Service.

So I use an Service extended Class.

public class DelayedToast extends IntentService {
    private final static boolean Debug = true;
    private final static String TAG = "ALT";

    public DelayedToast() {
        super("DelayedToast");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        final int delay = intent.getIntExtra("delay", -1);
        if (Debug) Log.i(TAG, "DelayedToast:onHandleIntent delay: " + delay);
        if (delay > 0) {
            SystemClock.sleep(delay * 1000);
            if (Debug) Log.i(TAG, "Wake up !! ");
            // Intent broadcastIntent = new Intent();
            Intent broadcastIntent = new Intent(getApplicationContext(), Receiver.class); // Need to be explicit for Broadcast : https://stackoverflow.com/questions/55610977/why-a-static-broadcastreceiver-not-working
            broadcastIntent.setAction(getString(R.string.intent_action));
            broadcastIntent.putExtra("delay", delay);
            sendBroadcast(broadcastIntent);
            if (Debug) Log.i(TAG, "sendBroadcast");
            showToast("toast Service: " + delay);
        }
    }

    // https://stackoverflow.com/a/34832674
    protected void showToast(final String msg) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (Debug) Log.i(TAG, msg);
                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
            }
        });
    }
}

I have declared this on the Manifest.

<service
    android:name=".DelayedToast"
    android:enabled="true"
    android:exported="true"
    android:process=":DelayedToast" />

I launch service with a Button :

public void onClickStart(View v) {
        EditText editText = findViewById(R.id.delay);
        final String str_delay = editText.getText().toString();
        if (Debug) Log.i(TAG, "MainActivity:onClickStart str: " + str_delay);
        if (!str_delay.isEmpty()) {
            final int delay = Integer.parseInt(str_delay);
            if (Debug) Log.i(TAG, "Q1_MainActivity:onClickStart delay: " + delay);
            if (delay > 0) {
                Intent intent = new Intent(this, DelayedToast.class);
                intent.putExtra("delay", delay);
                startService(intent);
            }
        }
    }

C:\Users\dark_vidor>adb shell "ps | grep tp08" // Here application isn't lauching

C:\Users\dark_vidor>adb shell "ps | grep tp08" // Application is running

u0_a246 20032 3012 2569888 132044 0 0 S test.tp08

C:\Users\dark_vidor>adb shell "ps | grep tp08" // I'm start "Delayed Toast" (service)

u0_a246 20032 3012 2573316 135404 0 0 S test.tp08

u0_a246 20090 3012 2324660 79876 0 0 S test.tp08:DelayedToast

C:\Users\dark_vidor>adb shell "ps | grep tp08" // I have receiver a Broacast Intet

u0_a246 20032 3012 2580964 137252 0 0 S test.tp08

u0_a246 20090 3012 2326168 96376 0 0 S test.tp08:DelayedToast

u0_a246 20127 3012 2325228 99696 0 0 S test.tp08:Receiver

C:\Users\dark_vidor>adb shell "ps | grep tp08" // Here I have quited the application, service is also killed

C:\Users\dark_vidor>

I'm followed some tutorials and I don't understand what I have forget and why my Service is killed after I quit my application while he should stay until I stop it I'm working with a Samsung A8, my application is in Java, SDK min 24

Have you any idea to fix this problem ?

1 Answers1

0

Service This is the base class for all services. When you extend this class, it's important to create a new thread in which the service can complete all of its work; the service uses your application's main thread by default, which can slow the performance of any activity that your application is running.

IntentService This is a subclass of Service that uses a worker thread to handle all of the start requests, one at a time. This is the best option if you don't require that your service handle multiple requests simultaneously. Implement onHandleIntent(), which receives the intent for each start request so that you can complete the background work.

Service and IntentService

In case you need Long term run, extend Service instead of IntentService.

SilenceCodder
  • 3,014
  • 20
  • 30
  • I understand this. But I have launched my Service on an other process. So why stop it with the application ? What don't I make correctly ? – dark_vidor Apr 17 '19 at 06:28