2013-08-03 2 views
1

제목에 따르면, 내 방송에 문제가 있습니다. 나는 메인 액티비티 (브로드 캐스트로 메시지를받는)로 인 텐트를 보내는 Service를 얻는다. 여기 안드로이드 - BroadCastReceiver를 instanciate 할 수 없습니다.

08-03 18:23:11.581: E/AndroidRuntime(776): FATAL EXCEPTION: main 
08-03 18:23:11.581: E/AndroidRuntime(776): java.lang.RuntimeException: Unable to instantiate receiver com.example.proyectjane_smartphone.Main.$IncomingBroadcaster: java.lang.ClassNotFoundException: com.example.proyectjane_smartphone.Main.$IncomingBroadcaster in loader dalvik.system.PathClassLoader[/data/app/com.example.proyectjane_smartphone-1.apk] 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1777) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.app.ActivityThread.access$2400(ActivityThread.java:117) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.os.Looper.loop(Looper.java:130) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.app.ActivityThread.main(ActivityThread.java:3687) 
08-03 18:23:11.581: E/AndroidRuntime(776): at java.lang.reflect.Method.invokeNative(Native Method) 
08-03 18:23:11.581: E/AndroidRuntime(776): at java.lang.reflect.Method.invoke(Method.java:507) 
08-03 18:23:11.581: E/AndroidRuntime(776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
08-03 18:23:11.581: E/AndroidRuntime(776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
08-03 18:23:11.581: E/AndroidRuntime(776): at dalvik.system.NativeStart.main(Native Method) 
08-03 18:23:11.581: E/AndroidRuntime(776): Caused by: java.lang.ClassNotFoundException: com.example.proyectjane_smartphone.Main.$IncomingBroadcaster in loader dalvik.system.PathClassLoader[/data/app/com.example.proyectjane_smartphone-1.apk] 
08-03 18:23:11.581: E/AndroidRuntime(776): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 
08-03 18:23:11.581: E/AndroidRuntime(776): at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
08-03 18:23:11.581: E/AndroidRuntime(776): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
08-03 18:23:11.581: E/AndroidRuntime(776): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1768) 
08-03 18:23:11.581: E/AndroidRuntime(776): ... 10 more 

는 브로드 캐스트 리시버의 코드 (그것은 내부 클래스로 정의, 그래서 매니페스트의 이름이 ". com.example.proyectjane_smartphone.Main $ IncomingBroadcaster"입니다 :

나는이 로그인있어 "$")를 사용하여 : 그것은 어떤 텍스트를 변경하여 "activityforResult"을 호출하고는 주요 활동 만 가능 렸기 때문에

class IncomingBroadcaster extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals(ACTION_CHANGE_TEXT_IO)) { 
      textIO.setText("OUTUT: " + intent.getStringExtra("text")); 
     } else if (action.equals(ACTION_SPEAK)) { 
      JANEvoi.speak(intent.getStringExtra("speak")); 
     } else if (action.equals(ACTION_CHANGE_LIGHT)) { 
      if (intent.getBooleanExtra("light", false)) { 
       connLight.setImageResource(R.drawable.lighton); 
      } else { 
       connLight.setImageResource(R.drawable.lightoff); 
      } 
     } else if (action.equals(ACTION_ENABLE_BT)) { 
      Intent enableBtIntent = new Intent(
        BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, 
        BluetoothManager.REQUEST_ENABLE_BT); 
     } 
    } 
} 

을 나는 내부 클래스로 정의 할 수있는 방송이 필요합니다. ,

내가 이해하지 못할 어떤
public void enableBluetoothAdapter() { 
     if (blueManager.getAdapter() == null) { 
      Log.d("BLUETOOTHMANAGER", "There's no bluetooth adapter"); 
     } else if (!blueManager.getAdapter().isEnabled()) { 
      Intent enableBTIntent = new Intent(Main.ACTION_ENABLE_BT); 
      sendBroadcast(enableBTIntent); 
      Log.d("BLUETOOTH", "BLUETOOTH ENCENDIDO"); 
     } 
    } 

("ACTION_ENABLE_BT"를 예를 들어) 의도 보내고받은 점이다 :

통화가 서비스를 만들어, 여기에 예외를 촬영 한 예이다 활동이 충돌하는 동안 블루투스를 활성화하는 "팝업 메뉴"가 나타납니다 ... 그래서 이전에 방송 충돌이 사용되었습니다 (방송이 인스턴스화 될 수 없다는 오류를 받았음에도 불구하고 ...). 마지막으로 여기

는 매니페스트입니다 : 내가 검색 한

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.proyectjane_smartphone" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="10" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.BLUETOOTH" /> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.proyectjane_smartphone.Main" 
      android:label="@string/app_name" 
      android:launchMode="singleTask" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver 
      android:name="com.example.proyectjane_smartphone.Main.$IncomingBroadcaster" 
      android:exported="false" > 
      <intent-filter> 
       <action android:name="es.jane.SpeakAction" /> 
       <action android:name="es.jane.ChangeTextIOAction" /> 
       <action android:name="es.jane.ChangeLight" /> 
       <action android:name="es.jane.EnableBT" /> 
      </intent-filter> 
     </receiver> 

     <service android:name="com.example.proyectjane_smartphone.Bluetooth.BluetoothService" > 
     </service> 
    </application> 

</manifest> 

그러나 나는 해결책을 찾지 못했습니다. 미리 감사드립니다.

답변

1

하더라도 정적 내부 클래스가 아닙니다. 액티비티의 인스턴스는 인스턴스화하는 데 필요하며 매니페스트에 정의 할 수있는 방법으로는 불가능합니다.

Activity 대신 작동하는 BroadcastReceiver를 사용하는 적절한 방법은 Activity#onResumeActivity#onPauseregisterunregister이다. 이 방법은 수신자가 Activity가 활성화되어있을 때 이벤트를 수신하고 내부 클래스와 적절하게 상호 작용할 수 있습니다. 내가 경우

unregisterReceiver(this.receiver) 
+0

마지막으로 문제를 관리합니다. 아이디어와 시간을 가져 주셔서 감사합니다 =) – Bardo91

1

내부 클래스를 수신기로 등록 할 수 없습니다. 외부 클래스 인스턴스를 통해서만 인스턴스화 될 수 있습니다. 즉, 해당 클래스에는 기본 생성자가 없습니다. 당신이 동적으로 활동에 클래스의 인스턴스를 등록 할 수 있습니다 그러나 : 당신이 여전히 BroadcastReceiver 때문에 작동하지 않을 클래스 이름을 고정 link

+0

마지막으로 문제를 해결합니다. 방송을 내부 클래스로 사용하려면 매니페스트에서 선언 할 필요가 없으며 onCreate onPause/onDestroy 메서드 만 등록하고 등록을 취소하면됩니다. 시간과 아이디어에 감사드립니다 =) – Bardo91

0

이 문제는 타르이었다

final IntentFilter filter = new IntentFilter(); 
this.populateFilter(filter); 
filter.addAction("es.jane.SpeakAction"); 
... 
registerReceiver(this.receiver, filter); 

그리고 onPause()에서 : onCreate()에서

당신은 수신기의 인스턴스를 생성 onResume() 당신이 비슷한 필요 했어 필요 BroadcastReceiver를 사용하면 Manifest에 선언 할 필요가 없습니다.

private BroadcastReceiver inBroadcast = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(ACTION_CHANGE_TEXT_IO)) { 
       textIO.setText("OUTUT: " + intent.getStringExtra("text")); 
      } else if (action.equals(ACTION_SPEAK)) { 
       JANEvoi.speak(intent.getStringExtra("speak")); 
      } else if (action.equals(ACTION_CHANGE_LIGHT)) { 
       if (intent.getBooleanExtra("light", false)) { 
        connLight.setImageResource(R.drawable.lighton); 
       } else { 
        connLight.setImageResource(R.drawable.lightoff); 
       } 
      } else if (action.equals(ACTION_ENABLE_BT)) { 
       Intent enableBtIntent = new Intent(
         BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableBtIntent, 
         BluetoothManager.REQUEST_ENABLE_BT); 
      } 
     } 
    }; 

을 그리고 마지막으로, 그것을 작동 : 는 다음 나는 활동에 다음 코드로 방송을 선언!