在后台保持活动活动,直到用户不杀死或关闭应用程序?

时间:2017-05-18 05:58:40

标签: android android-activity android-service onkeydown

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

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

android是否允许这样的行为?

更新:

我能够使用以下方法解决这个问题:

1]使用前台服务, 参考:https://developer.android.com/guide/components/services.html#Foreground

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

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

参考:https://developer.android.com/guide/topics/media-apps/mediabuttons.html

3 个答案:

答案 0 :(得分:1)

简单地说,只需创建一个新的服务类。在这里,使用此类,您可以在日志中看到硬件按钮单击事件。 我在这里使用音量键作为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 :(得分:0)

来自developer.android.com

  

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

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

这应该为您提供所需的所有信息: Visit this link

答案 2 :(得分:0)

更新:

我能够使用以下方法解决这个问题:

1]使用前台服务, 参考:https://developer.android.com/guide/components/services.html#Foreground

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

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

参考:https://developer.android.com/guide/topics/media-apps/mediabuttons.html