2013-02-04 68 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. 

我已經寫了廣播接收機的方法,並在mainfest XML甚至設置接收器和權限 我寫了下面的代碼,但我得到的運行時錯誤,我甚至試過刪除活動並運行,但導致錯誤。請給我建議一些解決方案。無法實例接收器,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); 

    } 
}; 

logcat的:

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. 登記在活動
  3. 註銷接收器中的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

你必須寫接收在自己的班級。不要將它作爲活動中的字段編寫。

如果您想在Manifest文件中註冊一個接收器,它必須位於其自己的文件中。創建一個新的類,將BroadcastReceiver擴展到新文件中。然後使用此類的名稱作爲清單中的接收者名稱而不是MainActivity。

+0

我沒有得到你可以解釋得更清楚嗎? – krish

+0

您必須將Receiver編寫在其自己的文件中。創建一個擴展BroadcastReceiver並覆蓋'onReceive'的新類,就像現在一樣。然後將這個新創建的類放在清單中而不是MainActivity中。 – deekay

+0

Okiee ..我創建了新的java類BootUpReceiver並編寫了代碼擴展BroadcastReceiver並覆蓋onReceive並編輯了mainfest ..讓我運行並檢查。 – krish

0

如果你聲明一個接收者的聲明比它必須在它自己的java文件中。在這裏你正在編程創建活動接收者的實例,所以要麼通過registerReceiver方法進行編程,要麼在另一個文件中創建, android中該文件的名稱:您的接收器標籤的名稱。

+0

是的,我是務實的,你的意思是說,我shd刪除mainfest.xml中的接收器代碼? – krish

+0

好的,如果您以編程方式註冊接收器,您只需刪除清單中的收件人聲明即可。但在我看來,使用專門的接收器類並將其放入表現形式會更好。通過這種方式,您可以通過查看清單而不是代碼來輕鬆確定您應用中使用的接收器。 – deekay

+0

我得到了解決方案感謝幫助.. – krish

相關問題