0

I have a receiver that plays audio when phone screen is turned on or off.

I send the audio file to the receiver like this

                try {
                    Intent i = new Intent("my.action");
                    i.putExtra("posLock", newPosition2).putExtra("songlistLock", mySongs).putExtra("lockSound", "lock");
                    sendBroadcast(i);
                }catch (Exception e) {
                    Log.e(TAG, "Intent error");
                }

and

                try {
                    Intent i = new Intent("my.action.unlock");
                    i.putExtra("posUnlock", newPosition3).putExtra("songlistUnlock", mySongs).putExtra("unlockSound", "unlock");
                    sendBroadcast(i);
                }catch (Exception e) {
                    Log.e(TAG, "Intent error2");
                }

Then I play the audio on my receiver class

LockScreenReceiver.java

public class LockScreenReceiver extends BroadcastReceiver {

MediaPlayer mp;
ArrayList<File> mySongs;
ArrayList<File> mySongs2;
Uri u;
Uri u2;
AudioManager am;
private static final String TAG = SecondScreen.class.getSimpleName();



@Override
public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();
    am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

    if(action.equals("my.action")) {
            Bundle b = intent.getExtras();
            mySongs = (ArrayList) b.getParcelableArrayList("songlistLock");
            int position = b.getInt("posLock", 0);

            u = Uri.parse(mySongs.get(position).toString());
        }

        if(action.equals("my.action.unlock")) {
            Bundle b = intent.getExtras();
            mySongs2 = (ArrayList) b.getParcelableArrayList("songlistUnlock");
            int position = b.getInt("posUnlock", 0);

            u2 = Uri.parse(mySongs2.get(position).toString());
        }


    if (action.equals(Intent.ACTION_SCREEN_ON) && am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL)
    {
        if(u2!=null) {
            stopPlaying();
            mp = MediaPlayer.create(context, u2);
            mp.start();
            Toast.makeText(context, "Audio on playing", Toast.LENGTH_SHORT).show();
        }
    }
    else if (action.equals(Intent.ACTION_SCREEN_OFF) && am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL)
    {
        if(u!=null) {
            stopPlaying();
            mp = MediaPlayer.create(context, u);
            mp.start();
            Toast.makeText(context, "Audio off playing", Toast.LENGTH_SHORT).show();

        }
    }


}

private void stopPlaying() {
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }
}
}

And I register my receiver using service

LockScreenService.java

public class LockScreenService extends Service {

BroadcastReceiver receiver;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
@SuppressWarnings("deprecation")
public void onCreate() {

    //Start listening for the Screen On, Screen Off, and Boot completed actions
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_BOOT_COMPLETED);

    //Set up a receiver to listen for the Intents in this Service
    receiver = new LockScreenReceiver();
    registerReceiver(receiver, filter);
    registerReceiver( receiver, new IntentFilter( "my.action" ) );
    registerReceiver( receiver, new IntentFilter( "my.action.unlock" ) );

   // Toast.makeText(getApplicationContext(), "Starting service now", Toast.LENGTH_SHORT).show();

    super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onDestroy() {
    unregisterReceiver(receiver);
    super.onDestroy();
}
}

And I also register my receiver in my Manifest.xml

Manifest.xml

    <receiver
        android:name=".LockScreenReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="my.action" />
            <action android:name="my.action.unlock" />
        </intent-filter>
    </receiver>

From what I read, when receiver is registered through the manifest, it should keep on running even after the app is terminated. But when I test it, my phone stops playing the audio after I closed my app from the recent apps manager.

2 Answers2

0

in.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); set this flag then use can runing receiver after app closed this works also me in on 4.4+.

0

another way use can use service then use ontaskremoved method then use code start new activity then that activity restart receiver or service its works fine like this code

public void onTaskRemoved(Intent rootIntent)
{

           Intent intent = new Intent(this, DummyActivity.class );
           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           startActivity(intent);
           // stopSelf();
           super.onTaskRemoved(rootIntent);     
}
Ronak Chaniyara
  • 5,335
  • 3
  • 24
  • 51