用于电源按钮的EventListener按下服务

时间:2015-01-08 16:02:27

标签: java android android-intent service keyevent

我想听服务中的电源键事件。

怎么办呢?

目前我正在使用一个应用程序,我需要在后台运行的服务中侦听某些事件的电源按钮,即使应用程序被终止或停止。

不知怎的,我可以设法得到它。

但是当我杀死/停止应用程序时,服务就会停止。

我怎样才能克服这个?

目前我使用的代码是:

服务类:

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文件,但如果它被终止或停止,我无法获得应用程序继续服务。

先谢谢。

1 个答案:

答案 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?

只需选择最适合需要/实施的方法。