จะตรวจสอบได้อย่างไรเมื่อมีการสร้างการเชื่อมต่อ WIFI ใน Android?


140

ฉันต้องตรวจสอบเมื่อฉันมีการเชื่อมต่อเครือข่ายผ่าน WiFi มีการส่งการออกอากาศใดเพื่อสร้างว่ามีการเชื่อมต่อเครือข่ายที่ถูกต้อง ฉันต้องตรวจสอบว่ามีการเชื่อมต่อเครือข่ายที่ถูกต้องสำหรับ HTTP อยู่ สิ่งที่ฉันควรฟังและการทดสอบเพิ่มเติมฉันต้องรู้ว่ามีการเชื่อมต่อที่ถูกต้อง


บางส่วนของคำถามนี้ได้รับการตอบที่นี่ฉันพบ: stackoverflow.com/questions/4238921/ …
Androider

1
แต่ยังมีคำถามว่าเมื่อใดที่ควรตรวจสอบเงื่อนไขเหล่านี้?
Androider

1
ฉันต้องการข้อเสนอแนะหากมีการออกอากาศที่จะเกิดขึ้นซึ่งสามารถรับการออกอากาศได้หรือไม่
Androider

1
ฉันจะทำสิ่งนี้บน Android O ในฐานะผู้รับสัญญาณออกอากาศโดยนัยเช่น android.net.wifi.STATE_CHANGE จะไม่ได้รับอนุญาตให้ลงทะเบียนในรายการอีกต่อไป (ดูdeveloper.android.com/guide/components/ … ) หากเราลงทะเบียนในกิจกรรมแอปพลิเคชัน (พูด onCreate) จะต้องลงทะเบียนใน onStop () และเราจะไม่ได้รับกิจกรรมที่เกี่ยวข้องกับ wifi อีกต่อไป
zafar142003

คำตอบ:


126

คุณสามารถลงทะเบียน a BroadcastReceiverเพื่อรับการแจ้งเตือนเมื่อมีการสร้างการเชื่อมต่อ WiFi (หรือหากการเชื่อมต่อเปลี่ยนไป)

ลงทะเบียนBroadcastReceiver:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

และจากนั้นคุณBroadcastReceiverทำสิ่งนี้:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
        if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
            //do stuff
        } else {
            // wifi connection was lost
        }
    }
}

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารประกอบสำหรับBroadcastReceiverและWifiManager

แน่นอนคุณควรตรวจสอบว่าอุปกรณ์เชื่อมต่อกับ WiFi มาก่อนหน้านี้หรือไม่

แก้ไข: ขอบคุณแบนเนอจีเนริงต่อไปนี้เป็นวิธีการตรวจสอบว่าอุปกรณ์เชื่อมต่ออยู่แล้ว:

private boolean isConnectedViaWifi() {
     ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
     return mWifi.isConnected();
}

1
ทำไม SUPPLICANT_CONECTION_CHANGE_ACTION ฉันคิดว่ามันเป็นเพียงแค่ CONNECTION_CHANGE เปลี่ยนการออกอากาศ ทำไมต้อง SUPPLCANT ??? ขอบคุณ
Androider

2
ฮะ? ฉันไม่เห็นการกระทำที่เรียกว่า connection_change ... ? ฉันเห็นสถานะ wifi เปลี่ยนไปเท่านั้น แต่การกระทำนั้นบ่งชี้ว่าเปิดใช้งาน wifi หรือไม่ (หรือเปิด / ปิดการใช้งาน) ไม่ว่าจะเชื่อมต่อหรือไม่ ... supplicant_connection_change_action ไม่ทำสิ่งที่คุณต้องการ?
jpm

9
สำหรับฉัน WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION ไม่ทำงานในกรณีที่การเชื่อมต่อกับสถานี wifi ที่รู้จักถูกสร้างขึ้น / สูญหาย แต่ WifiManager.NETWORK_STATE_CHANGED_ACTION ทำงานได้
ยาร์

1
"android.net.wifi.STATE_CHANGE" ได้ผลสำหรับฉัน ตรวจสอบคำตอบของฉันด้านล่าง
เอ็ม Usman Khan

1
"แน่นอนคุณควรตรวจสอบว่าอุปกรณ์เชื่อมต่อกับ WiFi ก่อนหน้านี้หรือไม่" - ดังนั้นในการรับสถานะ Wi-Fi เริ่มต้นคุณสามารถใช้วิธีนี้ ...private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); }
ban-geoengineering

106

สิ่งที่ดีที่สุดสำหรับฉัน:

AndroidManifest

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>

คลาส BroadcastReceiver

public class WifiReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {

      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if(info != null && info.isConnected()) {
        // Do your work. 

        // e.g. To check the Network Name or other info:
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
      }
   }
}

สิทธิ์

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดสำหรับ chage wifi เฉพาะของรัฐ ขอบคุณ
มิเคล

4
สำหรับการอ้างอิงได้ง่ายในอนาคตว่าการกระทำ hardcoded เป็นWifiManager.NETWORK_STATE_CHANGED_ACTION
Anonsage

3
if (info! = null && info.isConnected ()) = ไม่มีสปาเก็ตตี้
gswierczynski

1
เราจำเป็นต้องเขียนโค้ดใด ๆ เพื่อส่งการออกอากาศในกิจกรรมหลักหรือไม่?
Nisari Balakrishnan

1
ฉันจะทำสิ่งนี้บน Android O ในฐานะผู้รับสัญญาณออกอากาศโดยนัยเช่น android.net.wifi.STATE_CHANGE จะไม่ได้รับอนุญาตให้ลงทะเบียนในรายการอีกต่อไป (ดูdeveloper.android.com/guide/components/ … ) หากเราลงทะเบียนในกิจกรรมแอปพลิเคชัน (พูด onCreate) จะต้องลงทะเบียนใน onStop () และเราจะไม่ได้รับกิจกรรมที่เกี่ยวข้องกับ wifi อีกต่อไป
zafar142003

18

สำหรับฉันใช้WifiManager.NETWORK_STATE_CHANGED_ACTIONงานได้เท่านั้น

ลงทะเบียนเครื่องรับสัญญาณออกอากาศ:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

และรับ:

@Override
public void onReceive(Context context, Intent intent) {

    final String action = intent.getAction();

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        boolean connected = info.isConnected();

        //call your method
    }      
}

1
สำหรับฉันเช่นเดียวกับ WifiManager.NETWORK_STATE_CHANGED_ACTION ใช้งานได้คำอธิบายใด ๆ สำหรับเหตุผลที่ว่าทำไมจึงใช้งานได้เท่านั้น
benchuk

11

คำตอบที่ได้รับจากผู้ใช้ @JPM และ @usman นั้นมีประโยชน์มากจริงๆ มันใช้งานได้ดี แต่ในกรณีของฉันมันมาonReceiveหลายครั้งในเคสของฉัน4 ครั้งดังนั้นโค้ดของฉันจะทำงานหลายครั้ง

ฉันทำการดัดแปลงบางอย่างและทำตามความต้องการของฉันและตอนนี้มันมาเพียงครั้งเดียว

นี่คือคลาส java สำหรับ Broadcast

public class WifiReceiver extends BroadcastReceiver {

String TAG = getClass().getSimpleName();
private Context mContext;

@Override
public void onReceive(Context context, Intent intent) {

    mContext = context;


    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
                networkInfo.isConnected()) {
            // Wifi is connected
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String ssid = wifiInfo.getSSID();

            Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid );

        }
    }
    else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION))
    {
        int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        if (wifiState == WifiManager.WIFI_STATE_DISABLED)
        {
            Log.e(TAG, " ----- Wifi  Disconnected ----- ");
        }

    }
}
}

ใน AndroidManifest

<receiver android:name=".util.WifiReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1
wifiState คืออะไร
behelit

1
อยากทราบว่า wifiState คืออะไรมันสร้างอย่างไร
Evan Parsons

1
@behelit ตอนนี้ "wifiState" มีคำตอบที่แก้ไขแล้ว
Yog Guru

8

คุณสามารถเริ่มการเชื่อมต่อ wifi ได้หากคุณให้ทางเลือกแก่ผู้ใช้ในการแทนที่พฤติกรรมปกติของการถามทุกครั้ง

ฉันเลือกใช้สามวิธี ...

public boolean isOnline() 
{
 ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
 return (networkInfo != null && networkInfo.isConnected());
}  

นี่เป็นการตรวจสอบอย่างรวดเร็วว่ามีการเชื่อมต่ออินเทอร์เน็ตทั้ง Wifi หรือ CellData คุณสามารถเลือกการกระทำที่ต้องการได้จากที่นี่ จำเป็นต้องตรวจสอบในโหมดเครื่องบินหรือไม่

บนด้ายแยกต่างหาก ฉันตั้งค่าตัวแปร IpAddress เป็น = "" และสำรวจความคิดเห็นจนกว่าฉันจะมีที่อยู่ ip ที่ถูกต้อง

  WifiManager wifi;
  wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  WifiInfo wifiInfo = wifi.getConnectionInfo();
  int ipAddress = wifiInfo.getIpAddress();
  String ip = null;
  ip = String.format("%d.%d.%d.%d",
  (ipAddress & 0xff),
  (ipAddress >> 8 & 0xff),
  (ipAddress >> 16 & 0xff),
  (ipAddress >> 24 & 0xff));
  Log.e(" >>IP number Begin ",ip);

ข้อมูลโค้ดอื่น ... หากไม่ได้เปิดใช้งานอยู่ (โดยได้รับอนุญาตจากผู้ใช้ล่วงหน้า)

   if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true);  

7

เพื่อตรวจสอบสถานะการเชื่อมต่อ WIFI ฉันได้ใช้ CONNECTIVITY_ACTION จากคลาส ConnectivityManager ดังนั้น:

    IntentFilter filter=new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(receiver, filter);

และจาก BroadCastReceiver ของคุณ:

    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
        int networkType = intent.getIntExtra(
                android.net.ConnectivityManager.EXTRA_NETWORK_TYPE, -1);
        if (ConnectivityManager.TYPE_WIFI == networkType) {
            NetworkInfo networkInfo = (NetworkInfo) intent
                    .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null) {
                if (networkInfo.isConnected()) {

                    // TODO: wifi is connected
                } else {
                    // TODO: wifi is not connected
                }
            }
        }

    }

PS: ทำงานได้ดีสำหรับฉัน :)


1
fyi พร้อม Android 6 เมื่อคุณเชื่อมต่อข้อมูลเซลล์ที่ถูกต้องการเปลี่ยนแปลงสถานะ wifi จะไม่ทำให้ CONNECTIVITY_ACTION เหตุผลเดียวที่พวกเขาทำคือสถานะการเชื่อมต่อได้รับผลกระทบตอนนี้ไม่ใช่
บรูซ

5

รหัสนี้ไม่ต้องการการอนุญาตใด ๆ เลย มันถูก จำกัด เฉพาะการเปลี่ยนแปลงสถานะการเชื่อมต่อเครือข่าย Wi-Fi (เครือข่ายอื่น ๆ ไม่ได้นำมาพิจารณา) รับการตีพิมพ์เป็นแบบคงที่ในไฟล์ AndroidManifest.xml และไม่ต้องมีการส่งออกในขณะที่มันจะถูกเรียกโดยระบบprotected broadcast, NETWORK_STATE_CHANGED_ACTIONที่เชื่อมต่อเครือข่ายการเปลี่ยนแปลงทุกรัฐ

AndroidManifest:

<receiver
    android:name=".WifiReceiver"
    android:enabled="true"
    android:exported="false">

    <intent-filter>
        <!--protected-broadcast: Special broadcast that only the system can send-->
        <!--Corresponds to: android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION-->
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>

</receiver>

คลาส BroadcastReceiver:

public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*
 Tested (I didn't test with the WPS "Wi-Fi Protected Setup" standard):
 In API15 (ICE_CREAM_SANDWICH) this method is called when the new Wi-Fi network state is:
 DISCONNECTED, OBTAINING_IPADDR, CONNECTED or SCANNING

 In API19 (KITKAT) this method is called when the new Wi-Fi network state is:
 DISCONNECTED (twice), OBTAINING_IPADDR, VERIFYING_POOR_LINK, CAPTIVE_PORTAL_CHECK
 or CONNECTED

 (Those states can be obtained as NetworkInfo.DetailedState objects by calling
 the NetworkInfo object method: "networkInfo.getDetailedState()")
*/
    /*
     * NetworkInfo object associated with the Wi-Fi network.
     * It won't be null when "android.net.wifi.STATE_CHANGE" action intent arrives.
     */
    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

    if (networkInfo != null && networkInfo.isConnected()) {
        // TODO: Place the work here, like retrieving the access point's SSID

        /*
         * WifiInfo object giving information about the access point we are connected to.
         * It shouldn't be null when the new Wi-Fi network state is CONNECTED, but it got
         * null sometimes when connecting to a "virtualized Wi-Fi router" in API15.
         */
        WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
        String ssid = wifiInfo.getSSID();
    }
}
}

สิทธิ์:

None

1
การทำงานในอุปกรณ์ที่ใช้ <API 26. ตามที่ @Isham แนะนำการกระทำไม่ได้รับการสนับสนุนใน Android O
tiagocarvalho92

3

นี่คือตัวอย่างของรหัสของฉันซึ่งคำนึงถึงความต้องการของผู้ใช้ที่อนุญาตให้ใช้ comms เมื่อเชื่อมต่อกับ Wifi เท่านั้น

ฉันกำลังเรียกรหัสนี้จากภายในIntentServiceก่อนที่จะพยายามดาวน์โหลดเนื้อหา

โปรดทราบว่าNetworkInfoจะเป็นnullหากไม่มีการเชื่อมต่อเครือข่ายใด ๆ

private boolean canConnect()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    boolean canConnect = false;
    boolean wifiOnly = SharedPreferencesUtils.wifiOnly();

    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if(networkInfo != null)
    {
        if(networkInfo.isConnected())
        {
            if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) ||
               (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly))
            {
                canConnect = true;
            }
        }
    }

    return canConnect;
}

3

Android O ลบความเป็นไปได้ที่จะรับการถ่ายทอดโดยนัยสำหรับการเปลี่ยนสถานะ wifi ดังนั้นหากแอปของคุณปิดอยู่คุณจะไม่สามารถรับได้ ใหม่WorkManagerมีความสามารถในการทำงานเมื่อปิดแอปของคุณดังนั้นฉันได้ทดลองกับมันแล้วดูเหมือนว่าจะทำงานได้ค่อนข้างดี:

เพิ่มสิ่งนี้ไปยังการอ้างอิงของคุณ:

implementation "android.arch.work:work-runtime:1.0.0-alpha08"

WifiConnectWorker.kt

class WifiConnectWorker : Worker() {

    override fun doWork(): Result {
        Log.i(TAG, "I think we connected to a wifi")
        return Result.SUCCESS
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val workManager = WorkManager.getInstance()

        // Add constraint to start the worker when connecting to WiFi
        val request = OneTimeWorkRequest.Builder(WifiConnectWorker::class.java)
            .setConstraints(Constraints.Builder()
                .setRequiredNetworkType(UNMETERED)
                .build())
            .build()

        // The worker should be started, even if your app is closed
        workManager.beginUniqueWork("watch_wifi", REPLACE, request).enqueue()
    }
}

โปรดทราบว่านี่เป็นเพียงการทดสอบด่วนสำหรับการแจ้งเตือนแบบครั้งเดียว มีงานที่ต้องทำเพื่อรับการแจ้งเตือนเสมอเมื่อเปิดและปิด WiFi

PS: เมื่อแอปบังคับให้ออกคนงานจะไม่เริ่มทำงานดูเหมือนว่าWorkManagerจะเป็นการยกเลิกคำขอนั้น


มีวิธีใดบ้างที่จะเริ่มทำงานแม้ว่าแอปของฉันจะบังคับให้ออกจากสถานะแล้วก็ตาม ผู้จัดการงานกำลังทำงานกับ. setRequiredNetworkType (UNMETERED) เฉพาะเมื่อเปิดแอป มีวิธีใดที่จะทริกเกอร์คนงานแม้แอปจะถูกฆ่า (บังคับให้ปิดสถานะ) เพราะผู้รับกว้างโดยปริยายก็ค่อนข้าง จำกัด อะไรจะเป็นทางเลือกที่ดีที่สุด
Suresh

2

ฉันใช้รหัสนี้:

public class MainActivity extends Activity
    {
    .
    .
    .
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        .
        .
        .
        }

    @Override
    protected void onResume()
        {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);  
        }

    @Override
    protected void onPause()
        {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
        }

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context context, Intent intent)
            {
            final String action = intent.getAction();
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION))
                {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false))
                    {
                    // wifi is enabled
                    }
                else
                    {
                    // wifi is disabled
                    }
                }
            }
        };
    }

2

ฉันมีสองวิธีในการตรวจสอบการเชื่อมต่อ WiFi ที่รับบริบทของแอปพลิเคชัน:

1) วิธีการเก่าของฉัน

public boolean isConnectedWifi1(Context context) {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();           
        if (networkInfo != null) {
            NetworkInfo[] netInfo = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if ((ni.getTypeName().equalsIgnoreCase("WIFI"))
                        && ni.isConnected()) {
                    return true;
                }                   
            }
        }
        return false;
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
    return false;
}

2) วิธีการใหม่ของฉัน (ฉันกำลังใช้วิธีการนี้ในปัจจุบัน):

public boolean isConnectedWifi(Context context) {
         ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
         return networkInfo.isConnected();
}

ฉันจะทำสิ่งนี้บน Android O ในฐานะผู้รับสัญญาณออกอากาศโดยนัยเช่น android.net.wifi.STATE_CHANGE จะไม่ได้รับอนุญาตให้ลงทะเบียนในรายการอีกต่อไป (ดูdeveloper.android.com/guide/components/ … ) หากเราลงทะเบียนในกิจกรรมแอปพลิเคชัน (พูด onCreate) จะต้องลงทะเบียนใน onStop () และเราจะไม่ได้รับกิจกรรมที่เกี่ยวข้องกับ wifi อีกต่อไป
zafar142003


2

1) ฉันลองใช้วิธี Broadcast Broadcast ด้วยแม้ว่าฉันจะรู้ว่าCONNECTIVITY_ACTION / CONNECTIVITY_CHANGEนั้นเลิกใช้แล้วใน API 28 และไม่แนะนำ ยังผูกพันกับการใช้การลงทะเบียนอย่างชัดเจนโดยจะรับฟังตราบเท่าที่แอพยังทำงานอยู่

2) ฉันยังลอง Firebase Dispatcher ซึ่งทำงานได้ แต่ไม่เกินแอพที่ถูกฆ่า

3) วิธีที่แนะนำคือ WorkManager เพื่อรับประกันการดำเนินการที่เกินกว่ากระบวนการที่ถูกฆ่าตายและเป็นการภายในโดยใช้registerNetworkRequest ()

หลักฐานที่ยิ่งใหญ่ที่สุดที่สนับสนุนวิธี # 3 นั้นถูกอ้างอิงโดยเอกสาร Androidเอง โดยเฉพาะอย่างยิ่งสำหรับแอปในพื้นหลัง

นอกจากนี้ที่นี่

ใน Android 7.0 เรากำลังลบการออกอากาศที่ใช้โดยทั่วไปสามรายการ ได้แก่ CONNECTIVITY_ACTION, ACTION_NEW_PICTURE และ ACTION_NEW_VIDEO เนื่องจากสามารถปลุกกระบวนการพื้นหลังของแอพหลายแอพพร้อมกันและกรองหน่วยความจำและแบตเตอรี่ หากแอปของคุณได้รับสิ่งเหล่านี้ให้ใช้ประโยชน์จาก Android 7.0 เพื่อโยกย้ายไปยัง JobScheduler และ API ที่เกี่ยวข้องแทน

จนถึงตอนนี้มันใช้งานได้ดีสำหรับเราโดยใช้คำขอเป็นงวดของ WorkManager

ปรับปรุง: ฉันลงเอยด้วยการเขียนโพสต์สื่อซีรีส์ 2 เกี่ยวกับเรื่องนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.