2013-05-07 68 views
5

我已經定義在AndroidManifest.xml中的接收器接收PlAY_FINISHED動作,而在其他文件我送的意圖是廣播接收器就像如下:如何在清單文件中註冊自定義的intentfilter廣播接收器?

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 Manifest文件中註冊。

<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 2013-05-07 05:30:44

+0

上面更新了我的答案。 – NMALKO 2013-05-07 05:35:56

+0

是的..但在我的情況下,我應該如何接收這個意圖'Intent in = new Intent(PlAY_FINISHED);'?這是我想知道的... – Jolin 2013-05-07 05:38:10

6

的例子在清單的意圖過濾器的android:name只是一個任意字符串,而不是Java常量的「路徑」。問題是代碼中的字符串常量被定義爲"play finished",它與您在清單中指定的名稱"com.mysite.appname.MyStaticString.PLAY_FINISHED"不匹配。

應該

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

不要緊,什麼變量被調用,或者即使你存儲在字符串中的變量都沒有。或者說,它的名稱中包含一個錯字:)

你可以改變,而不是在清單中android:name"play finished",但自定義播放操作是系統級的,他們應該與您的應用程序的包名稱,以避免與其他碰撞資格應用。

相關問題