简体   繁体   中英

Android finish activity from non-Activity class

In my app I am checking if there is a network connection; if it does not have, start an activity and when when the connection is back, finish that activity. I am using broadcast receiver to determine network connection, but the application is crashing when it needs to finish that activity giving me a RestrictedContext error .

here is the LogCat output:

01-05 14:22:21.543: E/AndroidRuntime(7064): FATAL EXCEPTION: main
01-05 14:22:21.543: E/AndroidRuntime(7064): java.lang.RuntimeException: Unable to start receiver net.evolution.betting.application.ConnectionChangeReceiver: java.lang.ClassCastException: android.app.ReceiverRestrictedContext
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.app.ActivityThread.access$3200(ActivityThread.java:125)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.os.Looper.loop(Looper.java:123)

01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at java.lang.reflect.Method.invokeNative(Native Method)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at java.lang.reflect.Method.invoke(Method.java:521)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at dalvik.system.NativeStart.main(Native Method)
01-05 14:22:21.543: E/AndroidRuntime(7064): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext
01-05 14:22:21.543: E/AndroidRuntime(7064):     at net.evolution.betting.application.ConnectionChangeReceiver.onReceive(ConnectionChangeReceiver.java:37)
01-05 14:22:21.543: E/AndroidRuntime(7064):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)
01-05 14:22:21.543: E/AndroidRuntime(7064):     ... 10 more

and here is the class source:

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive( Context context, Intent intent ) {
        ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
        List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
        boolean isActivityFound = false; 
        for (int i = 0; i < activitys.size(); i++) { 
            if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{net.evolution.betting.application/net.evolution.betting.application.NotationActivity}")) {
                isActivityFound = true;
            }
        } 

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );
        if ( activeNetInfo != null && isActivityFound == true) {
            ((NotationActivity)context).finish();
        }else if( activeNetInfo == null){
            Intent i = new Intent("net.evolution.betting.application.NOTATIONACTIVITY");
            i.putExtra("DialogTitle", "Warining!");
            i.putExtra("DialogBody", "It seems like your app is not connected to Internet witch is required.Please check your network connection.");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

You cant do this "((NotationActivity)context)". "context" it is your Receiver's context, not your NotationActivity's context. So you can't cast it that way and get activity.

There several ways to do what you need. Google "finish activity from broadcast receiver". There a lot useful information which will help you to find best way for your case.

The problem is that on this line

 ((NotationActivity)context).finish();

Have your Receiver as an inner class of the activity so it can access the finish() method, or find another way to communicate from the receiver to the activity.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM