简体   繁体   English

Android-无法从另一个活动中调用方法

[英]Android- Couldn't Call a method from Another Activity

I'm developing an Android Application in which I have to verify whether the Device in Online or Offline mode (ie., I Have to verify whether the Connectivity Service is available or not ). 我正在开发一个Android应用程序,其中我必须验证设备是处于在线还是离线模式(即,我必须验证连接服务是否可用)。

I've two classes class A and Class B . 我有两个班级A和班级B。

In class A , I tried the code Snippets like below, 在A类中,我尝试了如下代码段,

package com.example.onlineverification;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b=(Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //new OnlineCheck().onCreate(savedInstanceState)
                Toast.makeText(MainActivity.this,"Online Verification "+new OnlineCheck().isOnline(), Toast.LENGTH_LONG).show();

            }
        });



      }

}

In Class B,the Code Snippets that I've tried is given below, 在B类中,我尝试过的代码段如下所示,

package com.example.onlineverification;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;


public class OnlineCheck extends Activity
{



    public boolean isOnline() {

        ConnectivityManager conMgr = (ConnectivityManager) this
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo();

        boolean state=false;

        for(NetworkInfo nInfo:networkInfo){
            if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){
            if (nInfo.getState() == NetworkInfo.State.CONNECTED
                    || nInfo.getState() == NetworkInfo.State.CONNECTING) {

                state=true;
                break;

            } 
            }
        }


        return state;
    }

}

when I click the button , the Application crashed and my Logcat error is given below, 当我单击按钮时,应用程序崩溃了,下面给出了我的Logcat错误,

08-23 10:55:29.152: E/AndroidRuntime(25945): FATAL EXCEPTION: main
08-23 10:55:29.152: E/AndroidRuntime(25945): java.lang.IllegalStateException: System services not available to Activities before onCreate()
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.app.Activity.getSystemService(Activity.java:4463)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at com.example.onlineverification.OnlineCheck.isOnline(OnlineCheck.java:18)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at com.example.onlineverification.MainActivity$1.onClick(MainActivity.java:24)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.view.View.performClick(View.java:4204)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.view.View$PerformClick.run(View.java:17355)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.os.Handler.handleCallback(Handler.java:725)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.os.Looper.loop(Looper.java:137)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at android.app.ActivityThread.main(ActivityThread.java:5041)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at java.lang.reflect.Method.invokeNative(Native Method)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at java.lang.reflect.Method.invoke(Method.java:511)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-23 10:55:29.152: E/AndroidRuntime(25945):    at dalvik.system.NativeStart.main(Native Method)

Do not call that method from Activity. 不要从Activity调用该方法。 Create a separate class and define that method as static. 创建一个单独的类并将该方法定义为静态。 like below 像下面

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkUtils {

    public static boolean isOnline(Context mContext) {
        ConnectivityManager conMgr = (ConnectivityManager) mContext
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo();
        boolean state = false;
        for (NetworkInfo nInfo : networkInfo) {
            if (nInfo.getType() == ConnectivityManager.TYPE_WIFI
                    || nInfo.getType() == ConnectivityManager.TYPE_ETHERNET
                    || nInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                if (nInfo.getState() == NetworkInfo.State.CONNECTED
                        || nInfo.getState() == NetworkInfo.State.CONNECTING) {
                    state = true;
                    break;
                }
            }
        }
        return state;
    }
}

And call this method in Activity as 并在Activity中将此方法称为

NetworkUtils.isOnline(MainActivity.this);

In your case 就你而言

Toast.makeText(MainActivity.this,"Online Verification "+NetworkUtils.isOnline(MainActivity.this), Toast.LENGTH_LONG).show();

This is your B class 这是你的B班

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;

public class OnlineCheck
{
    public boolean isOnline(Context context) {

        ConnectivityManager conMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo();

        boolean state=false;

        for(NetworkInfo nInfo:networkInfo){
            if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){
            if (nInfo.getState() == NetworkInfo.State.CONNECTED
                    || nInfo.getState() == NetworkInfo.State.CONNECTING) {

                state=true;
                break;

            } 
            }
        }


        return state;
    }

}

And call with following code 并使用以下代码调用

Toast.makeText(MainActivity.this,"Online Verification "+ new OnlineCheck().isOnline(MainActivity.this), Toast.LENGTH_LONG).show();

Here you are getting IllegalException it means it is not valid in android 在这里,您会收到IllegalException,这意味着它在android中无效

Runtime(25945): FATAL EXCEPTION: main
08-23 10:55:29.152: E/AndroidRuntime(25945):java.lang.IllegalStateException: System services not available to Activities before onCreate()
08-23 10:55:29.152: E/AndroidRuntime(25945):at android.app.Activity.getSystemService(Activity.java:4463)

I suggest you to do something like this 我建议你做这样的事情

 1) BaseActivity extends Activity
 2) OnlineCheck extends BaseActivity
 3) MainActivity extends BaseActivity

then code which is used in both activities write it down in BaseActivity. 然后在两个活动中使用的代码将其记录在BaseActivity中。

The problem is you are creating an instance of your OnlineCheck without going through the proper channels for creating an Activity. 问题在于您正在创建OnlineCheck的实例,而没有通过适当的渠道来创建活动。 You should either change activities to your online activity or move the isOnline() into MainActivity. 您应该将活动更改为在线活动,或者将isOnline()移入MainActivity。

See How to start new activity on button click for starting an activity from inside another one. 请参阅如何在单击按钮时启动新活动,以从另一个活动中开始活动。

The crux of it is you cannot just call new MyActivity(). 症结在于您不能只调用新的MyActivity()。 Activities are not designed to be initialized that way. 活动并非设计为以这种方式初始化。

EDIT: 编辑:

This could work to if you really really want it in the OnlineCheck class 如果您确实确实希望在OnlineCheck类中使用它,则可以这样做

Toast.makeText(MainActivity.this,"Online Verification "+OnlineCheck.isOnline(this), Toast.LENGTH_LONG).show();

public class OnlineCheck extends Activity
{



    public static boolean isOnline(Activity source) {

        ConnectivityManager conMgr = (ConnectivityManager) source
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo();

        boolean state=false;

        for(NetworkInfo nInfo:networkInfo){
            if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){
            if (nInfo.getState() == NetworkInfo.State.CONNECTED
                    || nInfo.getState() == NetworkInfo.State.CONNECTING) {

                state=true;
                break;

            } 
            }
        }


        return state;
    }

}

On 2.Activity Import MainActivity first 在2.Activity首先导入MainActivity

For example You are on 2.Activity and You will call method from 2.Activity On MainActivity name of method callMethode() 例如,您在2.Activity上,并且您将从2.Activity调用方法。在MainActivity中,方法callMethode()的名称

Activity 1 (For Example on MainActivity) 活动1(例如关于MainActivity)

public static void callMethode(Context context){
     // Your codes Here
    }

Activity 2 活动2

MainActivity.callMethode(getApplicationContext());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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