[英]How to Send BroadCast from one app to another app
我有 App A 和 App B。在 App AI 中,要向 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);
在 App B - 在MainActivity
,我有MyBroadCastReceiver
類。
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);
}
}
我收到錯誤 -接收器未注冊。
首先,首先在清單文件中的 app B 中聲明接收器,如下所示:
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
發送廣播時,將FLAG_INCLUDE_STOPPED_PACKAGES
標志添加到意圖[src] 中,因為當您從應用程序 A 廣播到應用程序 B 時,應用程序 B 可能未運行,此標志可確保即使應用程序未運行,廣播也能到達:
FLAG_INCLUDE_STOPPED_PACKAGES 標志在發送之前添加到意圖中,以指示允許意圖啟動已停止應用程序的組件。
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
在你的情況下,它會是這樣的:
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);
在 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);
在 App B 清單中
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
在 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);
}
}
在 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);
}
}
可能有兩種情況:
- 您的 appB 未運行,因此未實例化活動,因此未注冊接收器。
- 您的活動已被銷毀,這意味着您已取消注冊您在 onCreate() 中通過 registerReceiver() 注冊的接收器
解決方案 :
在清單中注冊您的廣播接收器。
appB 的內部清單:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
並注釋掉 appA 中的行
intent.setComponent(new ComponentName("com.pkg.AppB","com.pkg.AppB.MainActivity"));
在 MyBroadcastReceiver 中編寫邏輯以顯示相關數據/啟動新活動
MyReceiver 是類而不是對象。 創建
myReceiver = new MyReceiver();
並把......
registerReceiver(myReceiver,intentFilter);
如果這對某人有幫助並且對我有用
在應用程序 A 中的活動或內容提供者中-
Intent intent = new Intent("Updated");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setComponent (new
ComponentName "com.exam.appA",
"com.exam.appA.DbaseChanged"));
getContext().sendBroadcast(intent);
在清單中的 App B 中
<receiver
android:name=".DbaseChanged"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="Updated" />
</intent-filter>
</receiver>
在 App B 廣播接收器類中-
public class DbaseChanged extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent
intent) {
String act = intent.getAction();
if(act != null && act.equals("Updated") )
{
Toast.makeText(context, act ,
Toast.LENGTH_SHORT).show();
}
}
}
當我在清單中注冊廣播接收器時,我需要調用setPackage("package_name")
以確保明確性。 即使應用程序完全關閉,我也能夠接收數據。
// sending app sends broadcast
Intent intent = new Intent(ACTION_RECOMMEND);
intent.putExtra(LISTEN_RECOMMENDATION, "Triggered - Jhene Aiko");
intent.putExtra(WATCH_RECOMMENDATION, "Goblin - Kim Go-eun");
intent.setPackage("com.example.package.receiverapp");
sendBroadcast(intent);
//receiving app manifest registers receiver
<receiver
android:name=".ManifestRegisteredBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.random.action.RECOMMEND" />
</intent-filter>
</receiver>
通過活動注冊接收器時,我不需要添加intent.setPackage(package_name)
,但這也意味着如果活動被破壞,我將無法獲取數據(應用程序關閉,應用程序在后台長時間運行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.