Android O - Detect connectivity change in background

后端 未结 2 1005
独厮守ぢ
独厮守ぢ 2020-12-03 03:56

First off: I know that ConnectivityManager.CONNECTIVITY_ACTION has been deprecated and I know how to use connectivityManager.registerNetworkCallback

2条回答
  •  抹茶落季
    2020-12-03 04:29

    i've have to add some modifications to Ch4t4r jobservice and work for me

    public class JobServicio extends JobService {
    
        String LOG_TAG ="EPA";
        ConnectivityManager.NetworkCallback networkCallback;
        BroadcastReceiver connectivityChange;
        ConnectivityManager connectivityManager;
    
        @Override
        public boolean onStartJob(JobParameters job) {
            Log.i(LOG_TAG, "Job created");
            connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                connectivityManager.registerNetworkCallback(new NetworkRequest.Builder().build(), networkCallback = new ConnectivityManager.NetworkCallback(){
                    // -Snip-
                });
            }else{
                registerReceiver(connectivityChange = new BroadcastReceiver() { //this is not necesary if you declare the receiver in manifest and you using android <=6.0.1
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        Toast.makeText(context, "recepcion", Toast.LENGTH_SHORT).show();
                        handleConnectivityChange(!intent.hasExtra("noConnectivity"), intent.getIntExtra("networkType", -1));
                    }
                }, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            }
    
    
            Log.i(LOG_TAG, "Done with onStartJob");
            return true;
        }
        @Override
        public boolean onStopJob(JobParameters job) {
            if(networkCallback != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)connectivityManager.unregisterNetworkCallback(networkCallback);
            else if(connectivityChange != null)unregisterReceiver(connectivityChange);
            return true;
        }
        private void handleConnectivityChange(NetworkInfo networkInfo){
            // Calls handleConnectivityChange(boolean connected, int type)
        }
        private void handleConnectivityChange(boolean connected, int type){
            // Calls handleConnectivityChange(boolean connected, ConnectionType connectionType)
            Toast.makeText(this, "erga", Toast.LENGTH_SHORT).show();
        }
        private void handleConnectivityChange(boolean connected, ConnectionType connectionType){
            // Logic based on the new connection
        }
        private enum ConnectionType{
            MOBILE,WIFI,VPN,OTHER;
        }
    
        ConnectivityManager.NetworkCallback x = new ConnectivityManager.NetworkCallback() { //this networkcallback work wonderfull
    
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onAvailable(Network network) {
                Log.d(TAG, "requestNetwork onAvailable()");
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
                    //do something
                }
                else {
                    //This method was deprecated in API level 23
                    ConnectivityManager.setProcessDefaultNetwork(network);
                }
            }
    
            @Override
            public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                Log.d(TAG, ""+network+"|"+networkCapabilities);
            }
    
            @Override
            public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                Log.d(TAG, "requestNetwork onLinkPropertiesChanged()");
            }
    
            @Override
            public void onLosing(Network network, int maxMsToLive) {
                Log.d(TAG, "requestNetwork onLosing()");
            }
    
            @Override
            public void onLost(Network network) {
            }
        }
    }
    

    and you can call the jobservice from another normal service or boot_complete receiver

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
        Job job = dispatcher.newJobBuilder()
                            .setService(Updater.class)
                            .setTag("connectivity-job")
                            .setLifetime(Lifetime.FOREVER)
                            .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)             
                            .setRecurring(true)
                            .setReplaceCurrent(true)
                            .setTrigger(Trigger.executionWindow(0, 0))
                            .build();
        dispatcher.mustSchedule(job);
    }
    

    in manifest...

    
    

提交回复
热议问题