单击主页按钮时如何停止服务?

时间:2020-01-01 08:54:25

标签: android android-studio

我有一个SoundService可以在加载应用上播放声音。 我在splashActivity中启动服务。单击Home按钮时我想停止服务。 当我在MainActivity的onPause回调中添加stopService时,它将在单击主页按钮时以及在启动另一个活动时停止该服务。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

请改用Activity.onBackPressed()方法。

答案 2 :(得分:0)

对于活动: 可以搭配以下产品: ((Activity)getActivity())。finish();

仅从Activity即可使用Activity.onBackPressed()方法或Finish()方法。

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

ForActivity: .stopService(new Intent(getActivity(),ServiceClassName.class));

答案 3 :(得分:0)

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