Android 使活动在后台保持活动状态,直到用户不使用';不要杀死或关闭应用程序?

Android 使活动在后台保持活动状态,直到用户不使用';不要杀死或关闭应用程序?,android,android-activity,android-service,onkeydown,Android,Android Activity,Android Service,Onkeydown,我可以让Android活动在后台保持活动状态,直到用户不杀死或关闭应用程序 我想在后台检测用户点击某些特定的硬件按钮点击,因为onKeyDown在服务中不可用,我需要在后台保持我的活动活跃,直到用户杀死应用程序 安卓允许这样的行为吗 更新: 我通过以下方法解决了这个问题: 1] 使用前台服务, 参考: 2] 要处理媒体按钮,请在Android 21+之后单击下面的方法(在前台服务的onCreate()中使用此代码): 参考:来自developer.android.com 服务是在后台运行以执行以

我可以让Android活动在后台保持活动状态,直到用户不杀死或关闭应用程序

我想在后台检测用户点击某些特定的硬件按钮点击,因为
onKeyDown
在服务中不可用,我需要在后台保持我的活动活跃,直到用户杀死应用程序

安卓允许这样的行为吗


更新:

我通过以下方法解决了这个问题:

1] 使用前台服务, 参考:

2] 要处理媒体按钮,请在Android 21+之后单击下面的方法(在前台服务的onCreate()中使用此代码):


参考:

来自developer.android.com

服务是在后台运行以执行以下操作的组件 长时间运行的操作或为远程进程执行工作。A. 服务不提供用户界面。例如,服务 当用户处于不同的位置时,可能会在后台播放音乐 应用程序,或者它可以在不阻塞的情况下通过网络获取数据 用户与活动的交互。另一个组件,例如 活动,可以启动服务并让其按顺序运行或绑定 与之互动。服务作为服务的子类实现 您可以在《服务开发人员指南》中了解更多信息

因此,只要你创建了一个服务,用户退出你的应用程序,它仍然会运行。就像上面的例子一样

这将为您提供所需的所有信息:

简单地说,只需创建一个新的服务类。在这里,使用这个类,您可以在日志中看到硬件按钮单击事件这里我使用音量键作为onKeyEvent

public class Xtra extends Service {


@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

    final BroadcastReceiver vReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
            boolean isScreenOn = powerManager.isScreenOn();


            if (!isScreenOn) {

                PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
                PowerManager.WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourService");
                mWakeLock.acquire();
                // The screen has been locked
                // do stuff...
                Log.e("Do what you want to do from this service...", "Here screen is off..which do not show or work anything due to screen is off");
Toast.makeText(getActivity(), "Here screen is off..which do not show or work anything due to screen is off", Toast.LENGTH_SHORT).show();

} else {
                Log.e("Do what you want to do from this service...", "Here screen is on, works...");
Toast.makeText(getActivity(), "Here screen is on, works...", Toast.LENGTH_SHORT).show();

            }
        }

    };
    registerReceiver(vReceiver, new IntentFilter("android.media.VOLUME_CHANGED_ACTION"));
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    return super.onStartCommand(intent, flags, startId);
    //43200000 schedules notification on every 12 hours
}


@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    Log.e("BgService", "::>> Service Stopped...");
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
}
从活动中创建按钮单击事件以启动服务。它将在后台启动您的服务

Button btnSave;
btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
      //From here service starts when you click on a button.
           startService(new Intent(activity, Xtra.class));
        }
    });
不要忘记将此服务添加到您的清单中

<service android:name=".Xtra">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </service>


当您单击btnSave时,它将启动您的服务。现在只需移动到主屏幕并单击音量键,您肯定会得到结果,因为它对我来说工作正常。

更新:

我通过以下方法解决了这个问题:

1] 使用前台服务, 参考:

2] 要处理媒体按钮,请在Android 21+之后单击下面的方法(在前台服务的onCreate()中使用此代码):


Ref:

如果你在谷歌上搜索如何在我关闭应用程序之前保持我的服务,你会发现一个解决方案保持服务活动不是问题检测硬件按钮点击服务是不允许的,即使我们尝试一些广播,这样的硬件广播在更高的android版本中不起作用。您也可以在服务中执行onKeyDown和onkeydup点击事件@pcjNo onKeyDOwn在活动中可用,android.view.KeyEvent)不在服务中,您不应该这样做,活动也没有办法。您可以而且应该使用服务来实现这一点。保持服务活动不是问题,检测硬件按钮点击服务是不允许的,即使我们尝试了一些广播,这样的硬件广播在更高的android版本中不起作用。他问的是如何保持活动而不是服务。谢谢你在这里给我一些提示。你的答案与此类似。我将在我的服务中尝试这种方法。一点也不。请注意,此解决方案/操作虽然有效,但不是SDK的“正式”部分。请参见此处:另外,它仅在我将
android.media.VOLUME\u CHANGED\u ACTION
添加到清单中,和/或添加
android.intent.ACTION.media\u按钮作为接收器的触发器时对我有效。(不确定是哪一个更改修复了它)这个答案中的特定代码对我不起作用(Android 9)。我发现这个替代版本很有效:
<service android:name=".Xtra">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </service>
mediaSession = new MediaSessionCompat(this, TAG);
        mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);
        mediaSession.setCallback(new MediaSessionCompat.Callback() {
            @Override
            public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
                if (mediaButtonEvent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) {
                    KeyEvent event = (KeyEvent) mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                    if (KeyEvent.KEYCODE_HEADSETHOOK == event.getKeyCode() && event.getAction() == KeyEvent.ACTION_DOWN) {
                        Log.e(TAG, "Media Button clicked");
                        handleHeadphoneClick();
                    }
                }
                return false;
            }
        });
        mediaSession.setActive(true);