2012-03-20 5 views
0

Я работаю с источником android. Я отправляю широковещательную передачу из одного из приложений и написал фильтр намерений для этого же в манифесте другого приложения (Launcher), как показано.Исключение при отправке широковещательной рассылки на Android

<receiver 
     android:name="com.android.launcher2.LauncherModel" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="com.abc.THEMECHANGED" /> 
     </intent-filter> 
    </receiver> 

Класс, который расширяет приемник com.android.launcher2.LauncherModel. Я получаю следующее исключение в Launcher, когда происходит трансляция.

01-01 00:01:45.101: WARN/dalvikvm(835): threadid=1: thread exiting with uncaught exception (group=0x40b131f8) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835): FATAL EXCEPTION: main 
01-01 00:01:45.109: ERROR/AndroidRuntime(835): java.lang.RuntimeException: Unable to instantiate receiver com.android.launcher2.LauncherModel:    java.lang.InstantiationException: can't instantiate class com.android.launcher2.LauncherModel; no empty constructor 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2108) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.app.ActivityThread.access$1500(ActivityThread.java:125) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.os.Looper.loop(Looper.java:137) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.app.ActivityThread.main(ActivityThread.java:4368) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at dalvik.system.NativeStart.main(Native Method) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835): Caused by: java.lang.InstantiationException: can't instantiate class com.android.launcher2.LauncherModel; no empty constructor 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at java.lang.Class.newInstanceImpl(Native Method) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at java.lang.Class.newInstance(Class.java:1319) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2103) 
01-01 00:01:45.109: ERROR/AndroidRuntime(835):  ... 10 more 

Может кто-то пожалуйста, дайте мне знать, почему это происходит, и решение для того же

+0

не может создать экземпляр класса com.android.launcher2.LauncherModel; нет пустого конструктора. Пожалуйста, покажите код LauncherModel –

+0

[Код здесь] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2_r1.1/com/android /launcher2/LauncherModel.java#LauncherModel.onReceive%28android.content.Context%2Candroid.content.Intent%29) – user264953

ответ

1

Для имени вы должны только путь к классу от структуры базового пакета. В манифесте под тегом манифеста должен быть атрибут пакета, это будет ваш базовый пакет. Пример:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.jjnford.example" 
    android:versionCode="1" 
    android:versionName="@string/version" > 

Так что, если приемник были в пакете com.jjnford.example.lancher2 манифеста имя должно быть:

<receiver 
    android:name=".launcher2.LauncherModel" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="com.abc.THEMECHANGED" /> 
    </intent-filter> 
</receiver> 

Кроме того, поскольку ваш ресивер конкретизируется в системе, необходимо иметь пустой конструктор, так как система будет вызывать ваш метод onRecieve(), когда ваше указанное намерение поймано.

UPDATE

Here is an example о том, как создал BroadcastReceiver, который создается программно (смотрите мой ответ, поскольку он содержит код).

+0

спасибо. проверит это и обновит – user264953

+0

, ваше предложение поможет мне избавиться от исключения, которое я опубликовал в своем вопросе. только пустое конструкто помогло мне избавиться от этой проблемы. Но, к сожалению, моя проблема еще не решена. Он создает множество побочных эффектов, когда я использую пустой конструктор, как вы предположили, потому что в этом классе используются многочисленные объекты, когда я использую пустой конструктор. Я предпочитаю избавиться от этой проблемы, не используя пустой конструктор, чтобы у меня было 0 побочных эффектов. – user264953

+0

Тем не менее, я принимаю ваше решение, поскольку оно может помочь некоторым другим в будущем. Но попросите кого-нибудь предложить альтернативное решение для него без использования пустого конструктора. – user264953

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