Подтвердить что ты не робот

Как отправить BroadCast из одного приложения в другое приложение

У меня есть приложение A и приложение B. В приложении AI я хочу отправить трансляцию в приложение 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);

А в приложении 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);
    }
}

Я получаю сообщение об ошибке - получатель не зарегистрирован.

4b9b3361

Ответ 1

Первым делом сначала объявите получателя в приложении 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

Могут быть два случая:

  • Ваше приложение не работает, поэтому действие не создается, поэтому получатель не зарегистрирован.
  • Ваша деятельность уничтожена, означает, что вы зарегистрировали регистратор, зарегистрированный через registerReceiver(), в onCreate()

Решение:

Зарегистрируйте приемник вещания в манифесте.

Внутри манифеста 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, чтобы отобразить соответствующие данные/запустить новую активность.

Ответ 3

MyReceiver - это класс не объект. Создать

myReceiver = new MyReceiver(); 

и поместите...........

registerReceiver(myReceiver,intentFilter);

Ответ 4

Если это помогает кому-то, и это работает для меня

В приложении A в действии или в контенте 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);

В приложении B в манифесте

      <receiver
        android:name=".DbaseChanged"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="Updated" />
        </intent-filter>
      </receiver>

В приложении B приемник вещания class-

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

            }

            }
       }

Ответ 5

В приложении 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);
    }
}

Ответ 6

В Android 9 (уровень API 28) мне нужно было определить свой BroadcastReceiver внутри кода только для того, чтобы он работал.

Как это (добавлено внутри службы в моем случае - не имеет значения)

private MyReceiver myReceiver;

@Override
public void onCreate() {
    myReceiver = new MyReceiver();
    this.registerReceiver(welcomeAppReceiver, new IntentFilter("android.intent.action.myreceiver"));
}


@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

private class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        try {
            if (intent.getAction().equals("android.intent.action.myreceiver")) {
                //logic goes here
            }
        } catch (Exception e) {
            //some log goes here
        }
    }
}

Отправь трансляцию вот так

Intent intentMy = new Intent();
intentMy.setAction("android.intent.action.myreceiver");
intentMy.putExtra("whatever", true);
sendBroadcast(intentMy);