2013-01-05 38 views
0

我要检查,如果活动是从普通类(非活动)上运行,但应用程序崩溃,并给我NullPointerException,我没有设定permission GET_TASKS 这里是logcat的输出检查活动是从非活动运行的类

01-05 13:38:38.703: E/AndroidRuntime(5595): FATAL EXCEPTION: main 
01-05 13:38:38.703: E/AndroidRuntime(5595): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.evolution.betting.application/net.evolution.betting.application.InitActivity}: java.lang.NullPointerException 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.os.Looper.loop(Looper.java:123) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at dalvik.system.NativeStart.main(Native Method) 
01-05 13:38:38.703: E/AndroidRuntime(5595): Caused by: java.lang.NullPointerException 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at net.evolution.betting.application.ConnectionChangeReceiver.checkIsNotationActive(ConnectionChangeReceiver.java:58) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at net.evolution.betting.application.ConnectionChangeReceiver.<init>(ConnectionChangeReceiver.java:20) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at net.evolution.betting.application.InitActivity.onCreate(InitActivity.java:30) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-05 13:38:38.703: E/AndroidRuntime(5595):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

这里是我的源

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    Context c; 
    public ConnectionChangeReceiver(Context c){ 
     checkIsNotationActive(); 
     this.c = c; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null && checkIsNotationActive() == 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); 

    } 


    } 

    private boolean checkIsNotationActive(){ 


      ActivityManager activityManager = (ActivityManager)c.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; 
        } 
       } 
       return isActivityFound; 

    } 
} 
+1

logcat的输出?堆栈跟踪在哪里?哪条线投射NPE?这么多开放的问题... – WarrenFaith

+0

我已经把logcat输出 –

+0

而58行是哪一个? – WarrenFaith

回答

2

更改您的代码,因为你的c Context实例是null移动你的代码中onReceive,并使用上下文访问系统服务:

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    Context c; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    this.c = context; //<<<<<<< 

    // your code here 
    } 

} 
+0

如果将上下文作为参数,但解决方案基本正确,则不需要有上下文变量。使用上下文参数而不是上下文成员变量。 – WarrenFaith

+0

@WarrenFaith:是的,你说得对,但是OP想访问onReceive之外的上下文变量。第一种方法是在类级别声明一个Context变量,并在onReceive中分配上下文,第二种方式是OP可以将上下文作为参数传递给其他方法 –

+0

的确,我错过了私人方法。无论如何,我会推荐参数解决方案。无论如何,upvote :) – WarrenFaith

0

对不起,我不能找到问题的所在,但也许,你可以试试下面的方法:当你正在使用的广播接收器,为什么不 尝试在“NotationActivity”的“onCreate()”中发送广播(A),在“onDesdroy()”中发送另一个广播(B)。 然后,您可以通过检查变量来检查活动是否正在运行,可能是初始化为0的整数,当A收到时变为1,当B收到时变为2。