Java 如何从一个类继承方法并在另一个活动中使用它们

Java 如何从一个类继承方法并在另一个活动中使用它们,java,android,Java,Android,我有一个LoginActivity检查用户是否连接到internet。而且它工作得很好。但是现在我觉得我的活动充满了太多的代码,我想将internet checker与登录活动分开,但是我很难执行方法调用 这就是我尝试过的: InternetChecker类: public class InternetChecker { public void checkNet(){ if(connected()){ Snackbar.make(findViewB

我有一个LoginActivity检查用户是否连接到internet。而且它工作得很好。但是现在我觉得我的活动充满了太多的代码,我想将internet checker与登录活动分开,但是我很难执行方法调用

这就是我尝试过的:

InternetChecker类:

public class InternetChecker  {


public void checkNet(){

        if(connected()){
            Snackbar.make(findViewById(R.id.activity_login), "Your Internet Connection is Great",
                    Snackbar.LENGTH_LONG)
                    .setAction("Action", null).setActionTextColor(Color.RED).show();
            Log.i("TRUE","User is connected");

        }else{
            Snackbar.make(findViewById(R.id.activity_login), "Your You are not Connected to the internet",
                    Snackbar.LENGTH_LONG)
                    .setAction("Action", null).setActionTextColor(Color.RED).show();
            Log.i("TRUE","User is not connected");
        }

    }

    private boolean connected(){
        ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
    }
}
在这个类中,我在方法
checkNet()中的
findViewById
上得到一个错误专用布尔连接()中的code>{

因此,我通过在我的
InternetChecker
类中使用
extends-appcompativity
解决了这个问题,错误(
findViewbyId
消失了)。 我只是想知道这是否是正确的约定,如果不是,我应该扩展什么

但我的主要问题是: 在我的LoginActivity中,它将继承InternetChecker方法:

我已初始化InternetChecker类:

public class LoginActivity extends AppCompatActivity {

        private InternetChecker internetChecker = new InternetChecker();
然后,我尝试在名为
checkInternet
的方法中使用InternetChecker,该方法位于我的
LoginActivity
类中:

private void checkInternet(){
            InternetChecker = new InternetChecker();
        }
但我在这一行中得到了预期的错误表达式:

InternetChecker = new InternetChecker();
因此,我尝试了以下方法:

InternetChecker checkNet = new InternetChecker();
这次没有错误,但CheckNet有一个警告:变量CheckNet从未使用,当我运行应用程序时,应用程序不会调用
InternetChecker
方法并检查用户是否连接到internet

请指导我如何继承类
InternetChecker
中的方法,并将它们应用于
LoginActivity

注意:我的清单已经设置了权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
然后在
LoginActivity

public class LoginActivity extends BaseActivity {
然后,我在
LoginActivity
中创建了一个调用
checkNet
的方法:

private void checkInternet(){
    checkNet();
}
然后在我的LoginActivity的onCreate中调用此方法:

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

    checkInternet();

但是,如果有比我在这里所做的更好的方法,我将非常感谢您的回答,这样我就可以将is标记为正确答案。

您可以从
AppCompatActivity
中创建InternetCheck,然后使您的活动继承自
InternetChecker

public class InternetChecker  extends AppCompatActivity{


public void checkNet(){



        if(connected()){
            Snackbar.make(findViewById(R.id.activity_login), "Your Internet Connection is Great",
                    Snackbar.LENGTH_LONG)
                    .setAction("Action", null).setActionTextColor(Color.RED).show();
            Log.i("TRUE","User is connected");

        }else{
            Snackbar.make(findViewById(R.id.activity_login), "Your You are not Connected to the internet",
                    Snackbar.LENGTH_LONG)
                    .setAction("Action", null).setActionTextColor(Color.RED).show();
            Log.i("TRUE","User is not connected");
        }

    }

private boolean connected(){
    ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
然后:

public class LoginActivity extends InternetChecker
现在,您可以在LoginActivity中使用InternetChecker中的所有方法。InternetChecker可以调用
findViewById
,因为它从
AppCompatActivity
继承了此方法

您还可以使InternetChecker成为更常见的实用程序类,我个人建议:

public class InternetChecker{

private Context mContext;
public InternetChecker(Context context){
    mContext = context;
}
private boolean connected(){
    ConnectivityManager connectivityManager=(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
然后,无论何时您想要检查连接,您只需在活动中执行以下操作:

InternetChecker checker = new InternetChecker(this);

if(checker.connected()){
//connected
}

正确的方法是创建一个MiscUtils类

public class MiscUtils{
public static isConnected(Context context){
ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
}
现在,让您的所有活动扩展BaseActivity,它将扩展AppCompatActivity

在活动中,

public class BaseActivity extends AppCompatActivity{

    public void showNoInternetMessage(View view){
     Snackbar.make(view, "Your You are not Connected to the internet",
                        Snackbar.LENGTH_LONG)
                        .setAction("Action", null).setActionTextColor(Color.RED).show();
                Log.i("TRUE","User is not connected");
    }
    }
现在,从您的所有活动(因为它们扩展了BaseActivity),您只需调用

if(MiscUtils.isConnectedToInternet(this)){
}else{
showNoInternetMessage(//Any view id from this activity);
}

您可以创建一个公共类(common.java),而不是将其保存在活动中

public static boolean connected(Activity activity){
    ConnectivityManager connectivityManager=(ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo !=null && activeNetworkInfo.isConnected();
}
无论您在何处需要此方法,请按如下方式调用它

Common.connected(activity);

创建一个单独的类,该类只检查internet连接。如果您想显示快餐店,请在单独的活动中显示

互联网连接类别代码:

public class InternetConnection
{
    private Context con;
    private static InternetConnection ic = null;

    public static synchronized InternetConnection getInstanceInternet(Context con)
    {
        if (ic == null)
        {
            ic = new InternetConnection(con);
        }

        return ic;
    }

    private InternetConnection(Context con)
    {
        this.con = con;
    }

    public boolean isNetworkAvailable()
    {
        ConnectivityManager connectivityManager = (ConnectivityManager) con.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
}
上述类别的用途: 创建类的全局对象,并在创建活动时将其初始化。然后按如下方式检查它:

if (internetConnection.isNetworkAvailable())
{
    /// internet is avalable
}
else
{
    /// internet not available
}

您忘记了
InternetChecker=new InternetChecker();
上的变量名。我已经在我的LoginActivity中添加了该变量。在onCreate in LoginActivity中。您可以调用checkNet()方法;无需在内部创建另一个名为checkInternet的方法。整个想法是尽可能少的代码。因此,您不需要在LoginActivity内部调用checkNet的另一个方法。另外,您确实了解了checkNet();将在每次加载应用时运行并显示零食消息,对吗?这可能会惹恼用户。如果用户在您的appLoginActivity已扩展AppCompat活动上执行功能时未连接到网络,请尝试创建仅运行一次的方法并显示消息。如何在登录Ac中使用extends多个类tivity?你不需要让LoginActivity扩展AppCompat,它将通过InternetChecker进行扩展。你只需要让LoginActivity扩展InternetChecker,随着InternetChecker扩展AppCompativity,LoginActivity也将通过扩展来扩展AppCompativity。但我的主要目标是在我的整个应用程序中使用InternetChecker。然后我是否必须在每个类中进行intercheck,或者应该将internet check移动到整个应用程序中使用的应用程序类中。就像我们在Application launcher下的清单中所做的那样?从您在internet check中发布的内容来看,这听起来像是您的活动想要使用的东西(有一个findviewbyid方法调用,它属于活动内部)。因此,是的,您需要在每个要使用这些方法的活动中继承它。在这里,我仍然需要在MiscUtils中扩展AppCompativity。如果没有它,我会得到错误,无法找到方法GetSystemServices您不需要在MiscUtils中扩展AppCompativity,如果您看到代码MiscUtils,只需让您知道internet连接是否相应的活动将使用MiscUtils中的函数来检查连接,并相应地调用BaseActivity中的超级函数来显示消息
if (internetConnection.isNetworkAvailable())
{
    /// internet is avalable
}
else
{
    /// internet not available
}