Uitzending van de ene app naar de andere app verzenden

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 MainActivityheb ik MyBroadCastReceiverClass.

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_PACKAGEStoe 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:

  1. Je appB is niet actief, daarom wordt de activiteit niet geïnstantieerd en is de ontvanger dus niet geregistreerd.
  2. 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();
            }
            }
       }

Other episodes