2013-02-04 2 views
3
Problem: AutoStart On Boot Up causing classcastexception.. 

I am doing Location based application , I want to run the app whenever the phone bootup,So that my app will be running continuously, I just want to start the service as soon as the phone loads all the service. 

, 난에 시도 활동을 제거하고 실행하면 오류가 발생합니다. 제발 좀 솔루션을 제안하십시오.수신기를 초기화 할 수 없습니다, java.lang.ClassCastException가

MainFest.xml

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

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

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.BATTERY_STATS" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.omkar_gpslocation.MainActivity" 
      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="com.example.omkar_gpslocation.Activity_Settings" 
      android:label="@string/title_activity_activity__settings" > 
     </activity> 


<receiver android:enabled="true" android:name="com.example.omkar_gpslocation.MainActivity" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 

     <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
</receiver> 
    </application> 

</manifest> 

MainActivity

private BroadcastReceiver MyReceiver= new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent("com.example.omkar_gpslocation"); 
     context.startService(serviceIntent); 

    } 
}; 

로그 캣 :

당신은 쓸 필요가
02-04 13:21:08.462: E/AndroidRuntime(503): FATAL EXCEPTION: main 
02-04 13:21:08.462: E/AndroidRuntime(503): java.lang.RuntimeException: Unable to instantiate receiver com.example.omkar_gpslocation.MainActivity: java.lang.ClassCastException: com.example.omkar_gpslocation.MainActivity 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1873) 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.app.ActivityThread.access$2400(ActivityThread.java:155) 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1049) 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.os.Handler.dispatchMessage(Handler.java:130) 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.os.Looper.loop(SourceFile:351) 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.app.ActivityThread.main(ActivityThread.java:3820) 
02-04 13:21:08.462: E/AndroidRuntime(503): at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 13:21:08.462: E/AndroidRuntime(503): at java.lang.reflect.Method.invoke(Method.java:538) 
02-04 13:21:08.462: E/AndroidRuntime(503): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:969) 
02-04 13:21:08.462: E/AndroidRuntime(503): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:727) 
02-04 13:21:08.462: E/AndroidRuntime(503): at dalvik.system.NativeStart.main(Native Method) 
02-04 13:21:08.462: E/AndroidRuntime(503): Caused by: java.lang.ClassCastException: com.example.omkar_gpslocation.MainActivity 
02-04 13:21:08.462: E/AndroidRuntime(503): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1864) 
02-04 13:21:08.462: E/AndroidRuntime(503): ... 10 more 

답변

0

: 매니페스트없이 방송을 수신하고 활동에서 프로그래밍을 선언하는 방법

.

  1. 수신자를 활동의 내부 클래스로 작성하십시오.
  2. 는 방송 보내려면 onPause 방법

public class Simpleclass extends Activity 
{ 
    public final String ACTION_BROADCAST = "com.example.intent.action.something"; 
    private aBroadcastReceiver mReceiver; 

    private class aBroadcastReceiver extends BroadcastReceiver 
     { 
      @Override 
      public void onReceive(Context context, Intent intent) 
      { 
       foo(); 
       //do something 
      } 

     } 

     //[...] 

     @Override 
     public void onPause() 
     { 
      getApplicationContext().unregisterReceiver(mReceiver); 
      super.onPause(); 
     } 

     @Override 
     public void onResume() 
     { 
      final IntentFilter intentFilter = new IntentFilter(mReceiver); 
      mReceiver= new aBroadcastReceiver(); 
      getApplicationContext().registerReceiver(mReceiver, intentFilter); 
      super.onResume(); 
     } 
} 

에서 활동

  • 등록 취소 수신기의 onResume 방식의 수신기를 등록 :

    final Intent broadcast = new Intent(Simpleclass.ACTION_BROADCAST); 
    getApplicationContext().sendBroadcast(broadcast); 
    
  • 3

    당신의 수신 r. 활동에 필드로 쓰지 마십시오.

    수신자를 Manifest 파일에 등록하려면 자체 파일에 있어야합니다. BroadcastReceiver을 새 파일로 확장하는 새 클래스를 만듭니다. 그런 다음이 클래스의 이름을 MainActivity 대신 매니페스트의 수신자 이름으로 사용하십시오.

    +0

    를 내가 얻을 didnt가 u .. 더 명확하게 설명 할 수 있습니까? – krish

    +0

    수신자를 자체 파일에 작성해야합니다. BroadcastReceiver를 확장하고'onReceive'를 덮어 쓰는 새로운 클래스를 만드십시오. MainActivity 대신 매니페스트에 새로운 클래스를 추가하십시오. – deekay

    +0

    Okiee .. 새로운 Java 클래스 BootUpReceiver를 만들고 BroadcastReceiver를 확장하고 onReceive를 재정의하고 mainfest를 편집 한 코드를 작성했습니다. 실행하고 확인하도록하겠습니다. – krish

    0

    수신자를 선언하는 경우 자체 자바 파일 내에 있어야합니다. 여기서는 프로그래밍 방식으로 수신기의 인스턴스를 작성하므로 프로그래밍 방식으로 registerReceiver 메소드로 등록하거나 다른 파일에서 작성하여 제공하십시오 android의 해당 파일 이름 : 수신자 태그의 이름. 질문에 모두 들어

    +0

    그래, 나는 그것을 실용적으로하고있다. 나는 mainfest.xml에서 수신기 코드를 삭제한다고 말하고 싶다. – krish

    +0

    Ok 수신기를 프로그래밍 방식으로 등록하면 매니페스트에서 수신자 선언을 제거하기 만하면됩니다. 그러나 제 의견으로는 전용 수신기 클래스를 사용하여 그것을 manifeest에 넣는 것이 더 실용적 일 것입니다. 이 방법을 사용하면 코드 대신 매니페스트를보고 앱에서 사용되는 리시버를 쉽게 결정할 수 있습니다. – deekay

    +0

    도와 주셔서 감사합니다. – krish

    관련 문제