Как заставить getSystemService из второго файла класса .java работать в Android Studio?

Я приношу извинения. Я знаю, что есть много повторяющихся вопросов, подобных этому, но даже после прочтения их здесь я не могу заставить свой работать или правильно понять ответ. Я не могу прокомментировать другой пост, чтобы объяснить ответы, либо из-за необходимости повторения.


Так что я достаточно опытен, когда дело доходит до JavaScript, но я все еще новичок в Java и учусь. Недавно у меня была некоторая практика работы с Java на BlueJ.

Недавно я начал разрабатывать приложение с помощью Android Studio с помощью Создание вашего первого приложения, которому я без труда следовал, изучал и понимал .

Теперь, когда я разрабатываю свое собственное приложение. Я продолжаю сталкиваться с проблемами, когда пытаюсь привести в порядок фрагменты кода, которые я нашел, сохраняя их во втором файле .java с помощью https://stackoverflow.com/a/3496655/6318164. ответ.

Я попытался максимально сократить код, чтобы показать его здесь.

Net.java

package com.nova.netmanager;

import android.content.Context;
import android.net.wifi.WifiManager;

class Net {
    public boolean isWifiEnabled() {
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        return wifi.isWifiEnabled();
    }
}

MainActivity.java

package com.nova.netmanager;

import android.content.Context;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.Switch;

public class MainActivity extends AppCompatActivity {
    Switch wifiSwitch;
    WifiManager wifi;

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

        wifiSwitch = (Switch) findViewById(R.id.switch_wifi);
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        checkNetworkStatus();

        wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                wifi.setWifiEnabled(isChecked);
            }
        });
    }

    @Override
    protected void onResume() {
         super.onResume();

         checkNetworkStatus();
    }

    public void checkNetworkStatus() {
        Net net = new Net();
        wifiSwitch.setChecked(net.isWifiEnabled());
    }
}

Net.java - это мой собственный класс, который я пытаюсь сделать, чтобы хранить все коммуникации и сетевые вещи вместе, такие как проверка статуса и их переключение. Теперь мое приложение продолжает падать, а отладчик продолжает жаловаться на эту строку в Net.java после ее сужения.

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

Я пытался добавить extends AppCompatActivity в class Net, но возникают проблемы, говорящие о том, что он должен запускаться после onCreate, что он делает из логики потока скрипта, которую я вижу. Я даже пробовал getActivity(), которого не существует для класса, и пытался использовать этот Context из других ответов.

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

Я не понимаю, почему так сложно спросить Android, включен или выключен WiFi во втором сценарии. Я думал, что читал, что Android Studio должна быть простой, даже если никто раньше не кодировал.

Любая помощь будет оценена по достоинству. Извините за длинный пост и возможный дубликат.


person Nova    schedule 24.12.2016    source источник
comment
Пожалуйста, обновите свой вопрос, указав, как вы использовали Context (весь ваш код). В текущем состоянии я не могу сказать, передали ли вы контекст в свой конструктор или нет: stackoverflow.com/questions/17917968/   -  person Morrison Chang    schedule 24.12.2016


Ответы (1)


Вам нужно пройти context, как показано ниже

class Net { 
    public boolean isWifiEnabled(Context context) { 
        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        return wifi.isWifiEnabled();
    } 
}

И использовать его в своей деятельности: -

public class MainActivity extends AppCompatActivity { 
    Switch wifiSwitch;
    WifiManager wifi;

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

        wifiSwitch = (Switch) findViewById(R.id.switch_wifi);
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        checkNetworkStatus(); 

        wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override 
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                wifi.setWifiEnabled(isChecked);
            } 
        }); 
    } 

    @Override 
    protected void onResume() { 
         super.onResume(); 

         checkNetworkStatus(); 
    } 

    public void checkNetworkStatus() { 
        Net net = new Net();
        wifiSwitch.setChecked(net.isWifiEnabled(MainActivity.this));
    } 
}

Изменить: вам также необходимо добавить следующее разрешение в файл AndroidManifest

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
person mahesh_babariya    schedule 24.12.2016
comment
Большое спасибо. Это решило мою проблему. Хотя нельзя ли исключить вставку MainActivity.this из параметра функции моего класса или это обязательно? Или есть другой способ доступа к getSystemService()? Я спрашиваю, потому что мне нравится избегать беспорядка или возможной путаницы в моем коде. Если я должен угадать, эта штука Context работает как метод bind() в JavaScript? - person Nova; 24.12.2016