Broadcast receiver not working when app is closed

孤街醉人 提交于 2020-02-08 02:30:29

问题


So I have two different apps made, one sends a broadcast and another receives it and displays a toast. However, when I close the receiver app the broadcast is no longer received by the second app even though I defined the receiver in the manifest file.

The broadcast sender in the MainActivity of app1.

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button b = (Button)findViewById(R.id.button2);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent();
            i.setAction("com.example.ali.rrr");
            i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
            sendBroadcast(i);
            Log.e("Broadcast","sent");
        }
    });
}

App 2 broadcast receiver:

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    Toast.makeText(context, "Broadcast has been recieved!", Toast.LENGTH_SHORT).show();
    Log.e("SUCCESS", "IN RECIEVER");
    //throw new UnsupportedOperationException("Not yet implemented");
}

App 2s Manifest:

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.example.ali.rrr" />
        </intent-filter>
    </receiver>

    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main"
        android:theme="@style/AppTheme.NoActionBar" />
    <activity
        android:name=".Main2Activity"
        android:label="@string/title_activity_main2"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


回答1:


First of all you need to use the Service for this functionality to work.

In the Activity you can start and stop the service by using the below codes.

//to start a service
Intent service = new Intent(context, MyBrodcastRecieverService.class);
context.startService(service);

//to Stop service
Intent service = new Intent(context, MyBrodcastRecieveService.class);
context.stopService(service);



Then you can use the below service 


public class MyBrodcastRecieveService extends Service
{
 private static BroadcastReceiver br_ScreenOffReceiver;

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

 @Override
 public void onCreate()
 {
  registerScreenOffReceiver();
 }

 @Override
 public void onDestroy()
 {
  unregisterReceiver(br__ScreenOffReceiver);
  m_ScreenOffReceiver = null;
 }

 private void registerScreenOffReceiver()
 {
  br_ScreenOffReceiver = new BroadcastReceiver()
  {
   @Override
   public void onReceive(Context context, Intent intent)
   {
     Log.d(TAG, "ACTION_SCREEN_OFF");
     // do something, e.g. send Intent to main app
   }
  };
  IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
  registerReceiver(br_ScreenOffReceiver, filter);
 }
}



回答2:


Try this way..

Intent i = new Intent();
i.setAction("com.example.ali.rrr");
i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
i.setComponent(  
        new ComponentName("PackageNameApp2","PackageNameApp2.MainActivity"));  
sendBroadcast(i);



回答3:


You can go through below solution;

Activity.java

Intent intent=new Intent(MainActivity.this,BroadcastService.class);
startService(intent);

BroadcastService.java

public class BroadcastService extends Service {

private static MusicIntentReceiver br_ScreenOffReceiver;

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

@Override
public void onCreate()
{
    registerScreenOffReceiver();
}

@Override
public void onDestroy()
{

}

private void registerScreenOffReceiver()
{
    br_ScreenOffReceiver = new MusicIntentReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
                int state = intent.getIntExtra("state", -1);
                switch (state) {
                    case 0:
                        Log.e("AAAAAAAAAA", "Headset is unplugged");
                        break;
                    case 1:
                        Log.e("AAAAAAAAA", "Headset is plugged");
                        break;
                    default:
                        Log.e("AAAAAAAAAAAA", "I have no idea what the headset state is");
                }
            }
        }
    };
    IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(br_ScreenOffReceiver, filter);
}


}

Menifest

<service android:enabled="true" android:name=".BroadcastService" />


来源:https://stackoverflow.com/questions/44149921/broadcast-receiver-not-working-when-app-is-closed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!