2013-05-07 1 views
5

я определил приемник в AndroidManifest.xml получать PlAY_FINISHED действия, а в другом файле я посылаю намерение этого радиовещательного приемника, как следующим образом:Как зарегистрировать пользовательский фильтр намерения для вещания приемника в файле манифеста?

public String PlAY_FINISHED = "play finished"; 
... 
Intent in = new Intent(PlAY_FINISHED); 
this.service.sendBroadcast(in); 

так в моем файле манифеста, я поставил его, как это , где MyStaticString - это класс, содержащий всю статическую строку в приложении. Правильно ли это?

<intent-filter> 
     <action android:name="com.mysite.appname.MyStaticString.PLAY_FINISHED" /> 
    </intent-filter> 

ответ

4

Регистрация в файле манифеста Android.

<receiver android:name=".ReceiverDemo"> 
    <intent-filter> 
    <action android:name="marakana.intent.action.ReceiverDemo" /> 
    </intent-filter> 
</receiver> 

Регистрация программно.

... 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    // Create the receiver 
    receiver = new TimelineReceiver(); 
    filter = new IntentFilter(UpdaterService.NEW_STATUS_INTENT); 
} 

protected void onResume() { 
    super.onResume(); 
    super.registerReceiver(receiver, filter, 
     "com.marakana.yamba.SEND_TIMELINE_NOTIFICATIONS", null); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(receiver); 
} 
... 

UPDATE: несколько значений Если более чем одно значение может быть задано, элемент почти всегда повторяется, а не перечисления нескольких значений в пределах одного элемента. Например, цель фильтра можно перечислить несколько действий:

<intent-filter . . . > 
    <action android:name="android.intent.action.EDIT" /> 
    <action android:name="android.intent.action.INSERT" /> 
    <action android:name="android.intent.action.DELETE" /> 
    . . . 
</intent-filter> 

UPDATE2: Вот пример AndroidManifest.xml

<manifest 
    package="com.marakana.android.lifecycle" 
    android:versionCode="1" 
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <uses-sdk 
    android:minSdkVersion="10" 
    android:targetSdkVersion="11" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 

    <application 
    android:name=".ApplicationDemo" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name"> 
    <activity 
     android:name=".ActivityDemo" 
     android:label="@string/app_name"> 
     <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".AnotherActivity"></activity> 

    <activity android:name=".SystemServicesDemo"></activity> 

    <service android:name=".ServiceDemo"></service> 

    <service android:name=".IntentServiceDemo"> 
     <intent-filter> 
     <action android:name="marakana.intent.action.IntentServiceDemo" /> 
     </intent-filter> 
    </service> 

    <receiver android:name=".ReceiverDemo"> 
     <intent-filter> 
     <action android:name="marakana.intent.action.ReceiverDemo" /> 
     </intent-filter> 
    </receiver> 

    <provider 
     android:name=".ProviderDemo" 
     android:authorities="com.marakana.android.lifecycle.providerdemo" /> 

    </application> 
</manifest> 
+0

Я все еще не совсем понимаю, что такое marakana.intent.action.ReceiverDemo? – Jolin

+0

Обновлен мой ответ выше. – NMALKO

+0

да .. но в моем случае, как я должен принять это намерение? Intent in = new Intent (PlAY_FINISHED); '? это все, что я хочу знать ... – Jolin

6

android:name из умысла фильтра в манифесте просто произвольный string, а не «путь» к константе Java. Проблема в том, что ваша строковая константа в коде определяется как "play finished", которая не соответствует имени "com.mysite.appname.MyStaticString.PLAY_FINISHED", указанному в манифесте.

Это должно быть

public String PlAY_FINISHED = "com.mysite.appname.MyStaticString.PLAY_FINISHED"; 

Это не имеет значения, что называется переменная, или даже если хранить строку в переменную вообще. Или что его имя содержит опечатку :)

Вы можете вместо этого изменить android:name в манифесте на "play finished", но пользовательские действия широковещания будут общесистемными, поэтому они должны быть квалифицированы с именем пакета вашего приложения, чтобы избежать столкновений с другими Программы.

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