krish
krish

Reputation: 641

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 have wrote broadcast receiver method and in mainfest xml even set the receiver and permission I am writing the following code but I am getting runtime error, I even tried to remove the activity and run but its causing the 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

Upvotes: 3

Views: 4723

Answers (3)

JacksOnF1re
JacksOnF1re

Reputation: 3512

For everyone with the question:

How to receive the broadcast without the manifest and declare it programmatically in an activity.

  1. write the receiver as an inner class of your activity.
  2. register the receiver in the onResume method of the activity
  3. unregister receiver in the 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);

Upvotes: 0

deekay
deekay

Reputation: 681

You have to write your Receiver in its own class. Do not write it as a Field in an Activity.

If you want to register a receiver in the Manifest file it have to 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 receiver name in the manifest instead of MainActivity.

Upvotes: 4

kaushal trivedi
kaushal trivedi

Reputation: 3443

if you are declaring a receiver in manifest than it must be inside its own java file.Here you are creating the instance of receiver in activity programetically so either you register it programetically by registerReceiver method or make it in another file and give name of that file in android:name of your receiver tag.

Upvotes: 0

Related Questions