应用程序停止了Android服务

时间:2019-04-15 18:25:35

标签: android service

我尝试提供Android服务。

所以我使用服务扩展类。

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();
            }
        });
    }
}

我已经在清单上声明了这一点。

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

我使用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” //这里   应用程序没有启动

     

C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //应用程序正在运行

     

u0_a246 20032 3012 2569888 132044 0 0 S test.tp08

     

C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //我是   启动“延迟吐司”(服务)

     

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” //我   收到了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:接收器

     

C:\ Users \ dark_vidor> adb shell“ ps | grep tp08” //这里   我已经申请了,服务也被取消了

     

C:\ Users \ dark_vidor>

我遵循了一些教程,但我不明白自己忘记了什么,为什么退出服务后我的服务会被杀死,而他应该留下来直到我停止它 我正在使用Samsung A8,我的应用程序是Java,SDK 24分钟以上

您是否有解决此问题的主意?

1 个答案:

答案 0 :(得分:0)

服务 这是所有服务的基类。扩展此类时,创建一个新线程以使服务可以完成其所有工作非常重要。该服务默认情况下使用应用程序的主线程,这可能会降低应用程序正在运行的任何活动的性能。

IntentService 这是Service的子类,它使用辅助线程来一次处理所有启动请求。如果您不需要服务同时处理多个请求,则这是最佳选择。实现onHandleIntent(),该方法接收每个启动请求的意图,以便您可以完成后台工作。

Service and IntentService

如果需要长期运行,请扩展Service而不是IntentService。