2013-01-05 58 views
0

在我的應用程序中,我檢查是否有網絡連接;如果它沒有,請啓動一項活動,並在連接回來時完成該活動。我正在使用廣播接收器來確定網絡連接,但是當它需要完成該活動並給我一個RestrictedContext error時,應用程序崩潰。從非活動類的Android完成活動

這裏是logcat的輸出:

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 

這裏是類來源:

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); 
     } 
    } 
} 

回答

1

你不能這樣做 「((NotationActivity)上下文)」。 「context」是你的Receiver的上下文,而不是你的NotationActivity的上下文。所以你不能以這種方式投射,並獲得活動。

有幾種方法可以做你需要的。谷歌「從廣播接收器完成活動」。有很多有用的信息可以幫助你找到最適合你的案例。

1

的問題是,在這條線

((NotationActivity)context).finish(); 

讓你的接收機作爲一個內部類的活性,因此它可以訪問結束()方法,或找到另一種方式從接收器傳送到所述活動。