2013-05-07 9 views
5

Mam zdefiniowane odbiornik w AndroidManifest.xml otrzymać PlAY_FINISHED działania, aw innym pliku wyślę zamiaru tego odbiornika transmisji jak następuje:Jak zarejestrować niestandardowy filtr intencyjny do nadawania odbiornika w pliku manifestu?

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

więc w moim pliku manifestu, i ustawić ją tak , gdzie MyStaticString jest klasą zawierającą cały ciąg statyczny w aplikacji. Czy to jest właściwy sposób?

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

Odpowiedz

4

Rejestrowanie w pliku manifestu Android.

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

Rejestrowanie programowo.

... 
@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: Wiele wartości Jeśli więcej niż jedna wartość może być określony element jest prawie zawsze powtarzane, niż wymieniając wiele wartości w obrębie jednego elementu. Na przykład filtr intencji może wymienić kilka czynności:

<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: To przykładem 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

Nadal nie całkiem rozumiem, co reprezentuje marakana.intent.action.ReceiverDemo? – Jolin

+0

Zaktualizowałem moją odpowiedź powyżej. – NMALKO

+0

tak .. ale w moim przypadku w jaki sposób powinien odbiornik ten zamiar 'Intent in = new Intent (PLAY_FINISHED);'? To wszystko, co chcesz wiedzieć ... – Jolin

6

android:name się z zamiarem filtra w manifeście jest tylko arbitralne ciąg, a nie "ścieżka" do stałej Java. Problem polega na tym, że ciąg znaków w kodzie jest zdefiniowany jako "play finished", który nie pasuje do nazwy "com.mysite.appname.MyStaticString.PLAY_FINISHED" określonej w manifeście.

Powinno być

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

To nie ma znaczenia, co zmienna nazywa, lub nawet jeśli przechowywać ciąg w zmiennej w ogóle. Lub, że jej nazwa zawiera literówkę :)

Zamiast tego można zmienić android:name w manifeście na "play finished", ale niestandardowe akcje emisji są systemowe, więc powinny być kwalifikowane nazwą pakietu aplikacji, aby uniknąć kolizji z innymi aplikacje.

Powiązane problemy