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

3

我试图从广播接收器的onReceive方法中调用SCS类中的几个方法,但是到处都给我报错:“Cannot make a static reference to the non-static method CheckConnection() from the type 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>

再看一下错误信息,它与你的标题所说的不一样。 - user207421
2个回答

1
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,直接调用该方法即可。

你试过我的解决方案吗? - Mohammed Aouf Zouag
啊,那个你应该删除它。我会更新答案。 - Mohammed Aouf Zouag
这个解决方案对你有用吗? - Mohammed Aouf Zouag
检查我的更新:不要使用SCS.methodName(context),直接调用它:methodName(context) - Mohammed Aouf Zouag
我认为你不需要修改你的清单文件。保持原样即可。 - Mohammed Aouf Zouag

1
如果您不想基于系统接收器调用广播接收器,则可以尝试使用动态广播接收器,通过它可以调用您的活动方法。
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接