Намерение фильтровать на основе пользовательских данных

#android #android-intent

#Android #android-намерение

Вопрос:

Я хочу транслировать намерение с пользовательскими данными, и только получатель, у которого есть эти пользовательские данные, должен получать это намерение, как это можно сделать?

вот как я транслирую намерение :

 Intent intent = new Intent();
 intent.setAction("com.example");
 context.sendBroadcast(intent);
  

и я определяю широковещательный приемник следующим образом :

  <receiver android:name="com.test.myReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="com.example"></action>
        </intent-filter>
    </receiver>
  

Ответ №1:

Настройте свой класс MyReceiver в основном так, как опубликовал anmustangs.

 public class myReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context arg0, Intent intent) {
        //Do something
    }
}
  

Вам не нужно проверять действие намерения, потому что вы уже отфильтровали его на основе того, что вы включили в свой манифест, по крайней мере, в этом простом случае. У вас могут быть другие действия и фильтры, и в этом случае вам потребуется какая-то проверка полученного намерения.

Если вы хотите, чтобы фильтр фильтровал данные, это описано в документации sdk по фильтрам намерений. Я не силен в типах данных, поэтому любой пример, который я бы привел, был бы относительно плохим. В любом случае, вот ссылка на страницу фильтра намерений манифеста: http://developer.android.com/guide/topics/manifest/intent-filter-element.html

И конкретной страницы для элемента данных; http://developer.android.com/guide/topics/manifest/data-element.html

Комментарии:

1. я хотел фильтровать, используя пользовательские данные, а не пользовательское действие.

2. Хорошо, я отредактировал сообщение, чтобы добавить некоторые ссылки на документацию, если вы хотите фильтровать данные.

3. я видел документацию для Android, прежде чем задать вопрос, дело в том, что в узле данных у них есть path, scheme и pathPrefix. Какой из них я использую для пользовательских данных? можете ли вы привести пример.

4. К сожалению, я не могу… Я не разбираюсь в URI, типах mime и т.д. Я бы сам на самом деле хотел увидеть как простой пример, так и сложный.

Ответ №2:

Если вы уже определили свой класс широковещательного приемника, то следующий шаг — зарегистрировать его в Activity / Service, который вы хотели бы получить от широковещательного намерения. Пример для регистрации:

     IntentFilter iFilter = new IntentFilter();
    iFilter.addAction("com.example"); //add your custom intent to register
    //below is your class which extends BroadcastReceiver, contains action 
    //which will be triggered when current class received the broadcast intent
    MyReceiver myReceiver = new MyReceiver(); 
    registerReceiver(myReceiver, iFilter); //register intent amp; receiver
  

Если вы уничтожите действие / службу, для лучшей практики не забудьте отменить регистрацию широковещательного приемника в том же действии / службе:

 @Override
protected void onDestroy() {
    if(myReceiver!=null)
        unregisterReceiver(myReceiver)
    super.onDestroy();
}
  

Класс MyReceiver:

 public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context arg0, Intent intent) {
        if(intent.getAction().equals("com.example")){
            //DO SOMETHING HERE
        }
    }
}
  

Комментарии:

1. Приемник, который определен в манифесте, не обязательно регистрировать таким образом. Он будет получать широковещательные сообщения и запускать свой метод onReceive () исключительно на основе записи манифеста.

2. ах, я вижу, это имеет смысл .. максимальное спасибо за исправление