アプリ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では-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);
}
}
エラーが発生しています-受信者が登録されていません。
まず、マニフェストファイルでアプリ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);
次の2つの場合があります。
- 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);
マニフェストのアプリ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();
}
}
}
アプリ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);
}
}