Unable to instantiate receiver, java.lang.ClassCastException
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.
I wrote the broadcast receiver method and in the mainfest xml even set the receiver and permission I am writing the following code, but I get a runtime error, I even tried to delete the action and run, but it threw an error. please suggest me some solution.
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
source to share
For anyone with a question:
How to get a broadcast without a manifest and declare it programmatically in action.
- write the receiver as an internal class of your activity.
- register the receiver in the onResume method of the activity.
- unregister in onPause method
i.e.
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();
}
}
To send a broadcast:
final Intent broadcast = new Intent(Simpleclass.ACTION_BROADCAST);
getApplicationContext().sendBroadcast(broadcast);
source to share
You have to write your receiver in your class. Don't write it down as a field in action.
If you want to register the receiver in the manifest file, it must be in its own file. Create a new class that extends BroadcastReceiver
in a new file. Then use the name of this class as the recipient name in the manifest instead of MainActivity.
source to share
if you declare the receiver in your manifest than it should be inside its own java file. If you instantiate a receiver in an activity programmatically, so either you register it programmatically with the registerReceiver method, or make it in another file and specify the name of this file in android: receiver tag name.
source to share