2013-02-11 2 views
10

Я новичок в Android и пытаюсь понять связь между приложениями.Явное обращение к намерению динамически передающего приемника

Я пытаюсь написать 3 небольших приложения, которые могут общаться друг с другом. Если вы хотите отправить сообщение всем, вы просто используете неявное вещание.

неявного Намерениеintent.setAction("com.example.myChatMessage")

если вы хотите адресовать только 1, специфический приемник я сделал это с

Явного Намерениеintent.setComponent("com.example.test.android.broadcastreceiver.b", "com.example.test.android.broadcastreceiver.b.myBroadcastReceiver")

это работает, когда радиовещательный приемник является отдельным классом и определен в AndroidManifest.xml.

Мой вопрос: Можно ли явного адреса dynamicall зарегистрированный широковещательный приемник?

package com.example.test.android.broadcastreceiver.b; 

public class MainActivity extends Activity { 

private final IntentFilter intentfilter = new IntentFilter("com.example.myChatMessage"); 
private myBroadcastReceiver broadcastreceiver; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    broadcastreceiver = new myBroadcastReceiver(); 
    registerReceiver(broadcastreceiver, intentfilter); 
} 

public static class myBroadcastReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("message"); 
     Log.d("message", "B received: "+message);  
    } 
} 
} 

Он получает все неявные трансляции, но не имеет явного ответа - я не знаю, как горячо его адресовать. Вы можете мне помочь?

+0

Используя метод: 'intent.setPackage ("com.example.test.android.broadcastreceiver.b")' работает явный адрес приложения, а затем с помощью неявного намерения разрешения. Из-за ошибки [link] (https://www.eecs.berkeley.edu/~daw/papers/intents-mobisys11.pdf) вы должны использовать ее только с Android 4.0 «В качестве альтернативы, начиная с ICE_CREAM_SANDWICH, вы также можете безопасно ограничить трансляцию одним приложением с помощью Intent.setPackage' –

+0

Только один документ [ссылка] (https://www.cs.berkeley.edu/~daw/papers/andsurf-spsm12.pdf), который гласит: «Однако, Динамические Ресиверы (широковещательные приемники, объявленные во время выполнения) представляют собой исключение , поскольку некоторые из них могут получать неявные намерения. Таким образом, они всегда общедоступны, а намерения, которые они получают, должны совпадать с одним из их фильтров намерений. «Какой из них можно получить явным? –

ответ

8

Невозможно отправить явное намерение динамически зарегистрированному широковещательному приемнику. Регистрация приемника в AndroidManifest.xml - единственный способ.

Если вы динамически зарегистрировать BroadcastReceiver - позвонив по телефону Context.registerReceiver() - вы передаете BroadcastReceiver экземпляр ... Если вы пытаетесь отправить Intent к приемнику, называя класс BroadcastReceiver, он никогда не будет доставлен. Система Android не будет соответствовать объявлению, которое вы объявили классу экземпляра BroadcastReceiver, который вы зарегистрировали.

Источник: http://onemikro2nd.blogspot.com/2013/09/darker-corners-of-android.html

Смежные вопросы