【问题标题】:how to stop service when click home button?单击主页按钮时如何停止服务?
【发布时间】:2020-01-01 08:54:25
【问题描述】:

我有一个 SoundService 用于在加载应用程序时播放声音。 我在 splashActivity 中启动服务。单击Home 按钮时,我想停止服务。 当我在 MainActivity 的 onPause 回调中添加 stopService 时,它​​会在单击主页按钮时停止服务,并且在启动另一个活动时也会停止服务。

  protected void onPause() {
    stopService(new Intent(MainActivity.this, SoundService.class));
    super.onPause();
}

【问题讨论】:

标签: android android-studio


【解决方案1】:

将此代码用于主页按钮按下事件:

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();

HomeWatcher.class :

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerRecevier mRecevier;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mRecevier = new InnerRecevier();
    }

    public void startWatch() {
        if (mRecevier != null) {
            mContext.registerReceiver(mRecevier, mFilter);
        }
    }

    public void stopWatch() {
        if (mRecevier != null) {
            mContext.unregisterReceiver(mRecevier);
        }
    }

    class InnerRecevier extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}

OnHomePressedListener.class :

public interface OnHomePressedListener {
    public void onHomePressed();

    public void onHomeLongPressed();
}

【讨论】:

    【解决方案2】:

    改用 Activity.onBackPressed() 方法。

    【讨论】:

      【解决方案3】:

      对于活动: 您可以使用的碎片: ((Activity) getActivity()).finish();

      从 Activity 只需 Activity.onBackPressed() 方法或 Finish() 方法即可。

      对于服务: 对于片段: getActivity().stopService(new Intent(getActivity(), ServiceClassName.class));

      对于活动: .stopService(new Intent(getActivity(), ServiceClassName.class));

      【讨论】:

        【解决方案4】:

        由于没有内置的方式来监听主页按钮点击监听器,那么最好使用另一个应用程序事件来停止服务。最接近的一种是在应用程序进入后台时进行监听。可以使用ProcessLifecycleOwner 来实现这一点。只需在进程生命周期的观察者中使用onStop 事件即可停止服务。 更多信息可以在this article找到。

        【讨论】:

          猜你喜欢
          • 2021-10-05
          • 2021-11-23
          • 2016-08-17
          • 1970-01-01
          • 2016-11-07
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          相关资源
          最近更新 更多