我想听服务中的电源键事件。
怎么办呢?
目前我正在使用一个应用程序,我需要在后台运行的服务中侦听某些事件的电源按钮,即使应用程序被终止或停止。
不知怎的,我可以设法得到它。
但是当我杀死/停止应用程序时,服务就会停止。
我怎样才能克服这个?
目前我使用的代码是:
服务类:
public class SampleService extends Service
{
SettingContentObserver mSettingsContentObserver;
AudioManager mAudioManager;
private ComponentName mRemoteControlResponder;
private Intent intent;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Log.v("StartServiceAtBoot", "StartAtBootService -- onStartCommand()");
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
Toast.makeText(getApplicationContext(), "On", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Off", Toast.LENGTH_SHORT).show();
}
}
public void onCreate()
{
mSettingsContentObserver = new SettingContentObserver(this,new Handler());
getApplicationContext().getContentResolver().registerContentObserver
(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver );
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mRemoteControlResponder = new ComponentName(getPackageName(),
StartAtBootServiceReceiver.class.getName());
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new StartAtBootServiceReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onDestroy()
{
getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
}
}
BroadcastReceiver类:
public class StartAtBootServiceReceiver extends BroadcastReceiver
{
static boolean wasScreenOn;
private boolean screenOff;
public void onReceive(Context context, Intent intent)
{
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
wasScreenOn = false;
Toast.makeText(context, "Power Off", Toast.LENGTH_SHORT).show();
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
wasScreenOn = true;
}
Intent i = new Intent(context, SampleService.class);
i.putExtra("screen_state", screenOff);
i.setAction("com.example.antitheft.SampleService");
context.startService(i);
//
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i1 = new Intent();
i1.setAction("com.example.sampleonkeylistener.MainActivity");
context.startService(i1);
}
}
}
上面给出的是示例代码,我已经使用用户的权限创建了AndroidManifest.xml文件,但如果它被终止或停止,我无法获得应用程序继续服务。
先谢谢。
答案 0 :(得分:0)
@Override
public void onDestroy() {
super.onDestroy();
startService(new Intent(this, SampleService.class));
}
这是确保即使用户想要销毁服务也永远不会停止的一种方法。 这是实现您想要实现的目标的一种 ONE 方式。
其次,您可以尝试使用 startForeground()在“前景”中运行服务。
此外,请确保在您返回“ START_STICKY ”(您在共享的示例代码中执行此操作,并且我相信您也在使用App的代码中执行此操作:)) onStartCommand()。
这将确保如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则将其保持在已启动状态但不保留此传递的意图。稍后系统将尝试重新创建服务。
您可以找到一些额外的指示/提示,以确保您的服务不会在下方链接停止。
How can we prevent a Service from being killed by OS?
只需选择最适合您需要/实施的方法。