I have a service in my application that runs on the backend, the service can be started when I press the up button and stop when I press the volume button.
public class SettingsContentObserver extends ContentObserver { int previousVolume; Context context; public SettingsContentObserver(Context c, Handler handler) { super(handler); context=c; AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); previousVolume = audio.getStreamVolume(AudioManager.STREAM_RING); } @Override public boolean deliverSelfNotifications() { return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING); int delta=previousVolume-currentVolume; if(delta > 0) { System.out.println("Decreased") ; Intent intent = new Intent(context, MyAlarmService.class); context.stopService(intent); previousVolume=currentVolume; } else if(delta < 0) { System.out.println("Increased"); Intent intent = new Intent(context, MyAlarmService.class); context.startService(intent); previousVolume=currentVolume; } } }
I want to do the same when my phone is locked (when the screen is off), when I search on the network, I find that I have to use BroadcastReceivre, I test it, but it does not work.
public class YourBoardcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("get something", "i dont know what!!"); String intentAction = intent.getAction(); KeyEvent event = null; if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT); } if (event == null) { return; } int keycode = event.getKeyCode(); int action = event.getAction(); long eventtime = event.getEventTime(); if (keycode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keycode == KeyEvent.KEYCODE_HEADSETHOOK) { if (action == KeyEvent.ACTION_DOWN) { Intent intent1 = new Intent(context, MyAlarmService.class); context.stopService(intent1); if (isOrderedBroadcast()) { abortBroadcast(); } else if (action == KeyEvent.ACTION_UP) { Intent intent11 = new Intent(context, MyAlarmService.class); context.startService(intent11); } if (isOrderedBroadcast()) { abortBroadcast(); } } } } }
In the android manifest, I add:
<receiver android:name="YourBoardcastReceiver"> <intent-filter> <action android:name="android.intent.action.SCREEN_ON" /> </intent-filter> </receiver>
And in mainActivity on the oncrete method, I add:
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); ComponentName mRemoteControlResponder = new ComponentName(getPackageName(), YourBoardcastReceiver.class.getName());
May I help, Thinks.
Wafae source share