我可以在后台保持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
答案 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