Ik heb App A en App B. In App A wil ik een uitzending naar App B sturen.
Dit is de code voor 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);
En in App B – In MainActivity
heb ik MyBroadCastReceiver
Class.
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);
}
}
Ik krijg de foutmelding – Ontvanger is niet geregistreerd.
Antwoord 1, autoriteit 100%
Eerst declareer eerst de ontvanger in app B in het manifestbestand als volgt:
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
voeg bij het verzenden van de uitzending de vlag FLAG_INCLUDE_STOPPED_PACKAGES
toe aan de intentie[src] omdat wanneer je uitzendt van app A naar app B, app B mogelijk niet actief is, deze vlag zorgt ervoor dat de uitzending ook apps bereikt die niet actief zijn:
FLAG_INCLUDE_STOPPED_PACKAGES vlag is toegevoegd aan de intentie ervoor
wordt verzonden om aan te geven dat het de bedoeling is om een
onderdeel van een gestopte applicatie.
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
In jouw geval zal het als volgt zijn:
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);
Antwoord 2, autoriteit 12%
In App A: Verstuur de uitzending hier.
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);
In App B-manifest
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
In App B MainActivity: registreer de ontvanger oncreate() en maak de registratie onDestroy() ongedaan
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);
}
}
In App 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);
}
}
Antwoord 3, autoriteit 3%
Er kunnen twee gevallen zijn:
- Je appB is niet actief, daarom wordt de activiteit niet geïnstantieerd en is de ontvanger dus niet geregistreerd.
- Je activiteit is vernietigd, wat betekent dat je je ontvanger hebt uitgeschreven die je via registerReceiver() in onCreate() hebt geregistreerd
Oplossing:
Registreer uw uitzendontvanger in manifest.
Binnen manifest van appB :
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
En becommentarieer de regel in appA
intent.setComponent(new ComponentName("com.pkg.AppB","com.pkg.AppB.MainActivity"));
Schrijf de logica in MyBroadcastReceiver om relevante gegevens weer te geven/start nieuwe activiteit
Antwoord 4
MyReceiver is een klasse, geen object. Aanmaken
myReceiver = new MyReceiver();
en zet………..
registerReceiver(myReceiver,intentFilter);
Antwoord 5
Als dit iemand helpt en het werkt voor mij
In App A in activiteit of in een content provider-
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);
In App B in het manifest
<receiver
android:name=".DbaseChanged"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="Updated" />
</intent-filter>
</receiver>
In App B Broadcast ontvanger klasse-
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();
}
}
}