2013-05-07 46 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",但自定义播放操作是系统级的,他们应该与您的应用程序的包名称,以避免与其他碰撞资格应用。

相关问题