【问题标题】:How to stop IntentService如何停止 IntentService
【发布时间】:2016-12-04 09:29:41
【问题描述】:

我搜索了很多,但我不知道如何在单击按钮时停止 IntentService。我有一个以IntentService 开头的按钮,然后progressDialog 显示通过ResultReceiver 我取回数据。这个应用程序从设备中搜索并显示照片,所以我认为IntentService 是正确的做法。但我想在取消按钮上停止它。有这方面的一些例子或好的做法吗?

MainAcitivity:

@Override
public final void onReceiveResult(final int resultCode, final Bundle resultData) {
    switch (resultCode) {
        case ScanService.STATUS_RUNNING:
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(false);
            progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
//something to stop
                }
            });
            progressDialog.show();

            break;
        case ScanService.STATUS_FINISHED:
            progressDialog.dismiss();
            listOfPictures = resultData.getParcelableArrayList(DATA_KEY);
            break;

        case ScanService.STATUS_ERROR:
            final String error = resultData.getString(Intent.EXTRA_TEXT);
            Toast.makeText(this, error, Toast.LENGTH_LONG).show();
            break;
    }
}

扫描服务:

 @Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
protected void onHandleIntent(final Intent intent) {
    final ResultReceiver scanResultReceiver = intent.getParcelableExtra(RECEIVER_KEY);
    final Bundle bundle = new Bundle();
    scanResultReceiver.send(STATUS_RUNNING, bundle);

 // some work here

    bundle.putParcelableArrayList(DATA_KEY, new ArrayList<>(listOfPictures));
    scanResultReceiver.send(STATUS_FINISHED, bundle);
}

【问题讨论】:

标签: android android-intent android-service intentservice


【解决方案1】:

从服务外部:(例如按钮点击)

stopService(new Intent(context(), MyIntentService.class));

从服务内部:

stopSelf();

调试工具:
为了检查您的 Service/IntentService 是否处于活动状态,请使用此 ADB 命令(从命令行):

adb shell service list |grep <my.app.packagename>

【讨论】:

  • 有没有办法检查服务是否提前停止或完全结束?
  • 是的,服务会在onHandleIntent()结束的时候调用stopSelf(),你可以在onHandleIntent()的最后加一个日志,看看这个日志有没有写,如果没有的话服务过早停止。
  • 我添加了 stopService(myintent);在 onClick 监听器中,在服务的 ondestroy 中 stopSelf()。无论如何,在handleIntent 日志的末尾都会被记录。我试过了,它并没有停止服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多