从非静态的上下文调用静态方法

问题描述:

我想从我的广播接收器中的onReceive方法调用SCS类中的几个方法,但它给了我无处不在的错误“无法对非静态方法进行静态引用”静态方法CheckConnection()从类型SCS”从非静态的上下文调用静态方法

SCSReceiver.class

public class SCSReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    SCS.mehtodName(context); 
    // ... do what you need to do here... 
} 

SCS.class

public class SCS extends Activity { 
private Handler handler; 
private Runnable runnable; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_connection_stablizer); 
} 
public static void mehtodName(Context context) { 
    // TODO Auto-generated method stub 
    CheckConnection(); 
} 

private void CheckConnection() { 
    ConnectivityManager cn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nf = cn.getActiveNetworkInfo(); 
    if (nf != null && nf.isConnected() == true) { 
     //CheckAccess(); 
     Toast.makeText(this, 
       "Network Available! now checking Inernet access..", 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     // Toast.makeText(this, "Network Not Available", Toast.LENGTH_SHORT) 
     // .show(); 
    } 
} 

的manifest.xml

<activity 
     android:name="com.xyz.netspeedmaster.SCS" 
     android:label="@string/title_activity_connection_stablizer" > 
    </activity> 

    <receiver android:name="com.xyz.abc.SCSReceiver" > 
    </receiver> 
+0

再次看看错误消息。这不是它在你的头衔中所说的。 – EJP

充分利用SCSReceiver类的内部类的SCS类:

public class SCS extends Activity { 
private Handler handler; 
private Runnable runnable; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_connection_stablizer); 
} 
public static void methodName(Context context) { 
    // TODO Auto-generated method stub 
    CheckConnection(); 
} 

private void CheckConnection() { 
    ConnectivityManager cn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nf = cn.getActiveNetworkInfo(); 
    if (nf != null && nf.isConnected() == true) { 
     CheckAccess(); 
     Toast.makeText(this, 
       "Network Available! now checking Inernet access..", 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     // Toast.makeText(this, "Network Not Available", Toast.LENGTH_SHORT) 
     // .show(); 
    } 
} 

class SCSReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    methodName(context); 
    // ... do what you need to do here... 
} 

} 

无需SCS.methodName,只需直接调用该方法。

+0

您是否尝试过我的解决方案? –

+0

啊,你应该删除它。我会更新答案。 –

+0

解决方案是否适合您? –

如果您不想调用基于System Receivers的BroadcastReceiver,那么您可以尝试使用Dynamic BroadcastReceiver,通过它可以调用Activity的方法。

public class SCS extends Activity { 
private Handler handler; 
private Runnable runnable; 
private IntentFilter filter; 
private BroadcastReceiver receiver; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_connection_stablizer); 

    filter=new IntentFilter("com.your_package.ANY_TEXT_STRING"); 
    receiver=new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
       mehtodName(context); //Invoke your methods from here 
        } 
      }; 
     registerReceiver(filter,receiver); 

     //Place the below two lines where you want to trigger BroadcastReceiver 
     Intent intent=new Intent("com.your_package.ANY_TEXT_STRING"); 
     sendBroadcast(intent); 

} 
public static void mehtodName(Context context) { 
    // TODO Auto-generated method stub 
    CheckConnection(); 
} 

private void CheckConnection() { 
    ConnectivityManager cn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nf = cn.getActiveNetworkInfo(); 
    if (nf != null && nf.isConnected() == true) { 
     //CheckAccess(); 
     Toast.makeText(this, 
       "Network Available! now checking Inernet access..", 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     // Toast.makeText(this, "Network Not Available", Toast.LENGTH_SHORT) 
     // .show(); 
    } 
}