如何将BroadCast从一个应用程序发送到另一个应用程序

abh*_*hek 36 android broadcast broadcastreceiver

我有App A和App B.在App中我想向App B发送广播.这是App A的代码:

final Intent intent = new Intent();
intent.setAction("com.pkg.perform.Ruby");
intent.putExtra("KeyName", "code1id");
intent.setComponent(new ComponentName("com.pkg.AppB", "com.pkg.AppB.MainActivity"));
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

在App B - In中MainActivity,我有MyBroadCastReceiverClass.

public class MainActivity extends Activity {
    private MyBroadcastReceiver MyReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Receive broadcast from External App
        IntentFilter intentFilter = new IntentFilter("com.pkg.perform.Ruby");
        MyReceiver = new MyBroadcastReceiver();
        if(intentFilter != null)
        {
            registerReceiver(MyReceiver, intentFilter);
        }
    }

    public class MyBroadcastReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(MainActivity.this, "Data Received from External App", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(MyReceiver != null)
            unregisterReceiver(MyReceiver);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误 - Receiver未注册.

dsh*_*rew 43

首先在清单文件中的app B中声明接收器,如下所示:

<receiver android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter>
          <action android:name="com.pkg.perform.Ruby" />
        </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

当发送广告添加FLAG_INCLUDE_STOPPED_PACKAGES标志到intent [src]时,因为当你从应用A广播到应用B时,应用B可能没有运行,这个标志确保广播甚至可以触及即使没有运行的应用:

FLAG_INCLUDE_STOPPED_PACKAGES标志在发送之前添加到intent中,以指示允许意图启动已停止的应用程序的组件.

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它将是这样的:

    final Intent intent=new Intent();
    intent.setAction("com.pkg.perform.Ruby");
    intent.putExtra("KeyName","code1id");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    intent.setComponent(  
        new ComponentName("com.pkg.AppB","com.pkg.AppB.MyBroadcastReceiver"));  
    sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

  • 它只有在我更改`new ComponentName("com.pkg.AppB","com.pkg.AppB.MainActivity"));`到`new ComponentName("com.pkg.AppB","com.pkg.AppB)时才有效.MyBroadcastReceiver"));`,其中`MyBroadcastReceiver`是此接收者的类名. (8认同)
  • 正如文档所说,默认情况下`FLAG_INCLUDE_STOPPED_PACKAGES`是隐式的 (2认同)

小智 6

在 App A 中:在此处发送广播。

 final Intent i= new Intent();
 i.putExtra("data", "Some data");
 i.setAction("com.pkg.perform.Ruby");
 i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
 getApplicationContext().sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

在 App B 清单中

 <receiver  android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.pkg.perform.Ruby" />
            </intent-filter>
        </receiver>
Run Code Online (Sandbox Code Playgroud)

在 App B MainActivity 中:注册接收者 oncreate(),并取消注册 onDestroy()

 public class MainActivity extends AppCompatActivity
 {
      private MyBroadcastReceiver MyReceiver;

       @Override
       protected void onCreate(Bundle savedInstanceState)
       {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            MyReceiver = new MyBroadcastReceiver();
            IntentFilter intentFilter = new IntentFilter("com.pkg.perform.Ruby");
            if(intentFilter != null)
            {
               registerReceiver(MyReceiver, intentFilter);
            }
       }

       @Override
       protected void onDestroy()
       {
           super.onDestroy();
           if(MyReceiver != null)
               unregisterReceiver(MyReceiver);
       }
  }
Run Code Online (Sandbox Code Playgroud)

在 App B 中广播接收器

public class MyBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String data = intent.getStringExtra("data");
        Log.i("BR" ,"Data received:  " + data);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在 MainActivity 中收听接收器,则将其放在清单中毫无意义。 (3认同)

d.k*_*.k. 1

MyReceiver 是类而不是对象。创造

myReceiver = new MyReceiver(); 
Run Code Online (Sandbox Code Playgroud)

并把…………

registerReceiver(myReceiver,intentFilter);
Run Code Online (Sandbox Code Playgroud)