簡體   English   中英

如何將廣播從一個應用程序發送到另一個應用程序

[英]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);
    }
}

可能有兩種情況:

  1. 您的 appB 未運行,因此未實例化活動,因此未注冊接收器。
  2. 您的活動已被銷毀,這意味着您已取消注冊您在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM