web-dev-qa-db-ja.com

BroadCastをあるアプリから別のアプリに送信する方法

アプリAとアプリBがあります。アプリAでは、アプリBにブロードキャストを送信します。これはアプリ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では-MainActivityMyBroadCastReceiverクラスがあります。

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);
    }
}

エラーが発生しています-受信者が登録されていません

33
abh22ishek

まず、マニフェストファイルでアプリ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);
41
dsharew

次の2つの場合があります。

  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にロジックを記述して、関連データを表示したり、新しいアクティビティを起動したりします。

2
abhishesh

MyReceiverはオブジェクトではなくクラスです。作成する

myReceiver = new MyReceiver(); 

そして、置きます...........

registerReceiver(myReceiver,intentFilter);
0
d.k.

これが誰かを助け、それが私のために働くなら

アクティビティ中またはコンテンツプロバイダー内のアプリ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);

マニフェストのアプリ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();

            }

            }
       }
0
Jro

アプリ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);

アプリBマニフェスト内

 <receiver  Android:name=".MyBroadcastReceiver"
            Android:enabled="true"
            Android:exported="true">
            <intent-filter>
                <action Android:name="com.pkg.perform.Ruby" />
            </intent-filter>
        </receiver>

アプリ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);
}}

アプリB BroadcastReceiverで

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