본문 바로가기
안드로이드/개발자 일상

안드로이드 NetworkCallback(실시간 네트워크 체크)

by 차누감 2020. 3. 25.

NetworkCallback에 자세한 사항은 아래 안드로이드 개발자 사이트를 참고 바랍니다.

https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback

 

ConnectivityManager.NetworkCallback  |  Android 개발자  |  Android Developers

ConnectivityManager.NetworkCallback public static class ConnectivityManager.NetworkCallback extends Object java.lang.Object    ↳ android.net.ConnectivityManager.NetworkCallback Base class for NetworkRequest callbacks. Used for notifications about network c

developer.android.com

앱을 꺼도 확인을 하기 위해서 Service도 사용하겠습니다.

( 간단하니까 걱정 안하셔도 됩니다.)

 


<실행 화면> 현재 네트워크 접속 유무를 알 수 있습니다. (앱이 종료 되어도, Service 컴퍼넌트 이용)

 

이제 앱을 종료하고 테스트 해봅니다.

( Service로 실행하기 때문에 정상 동작하는 것을 알 수 있습니다. )


가장 먼저 AndroidManifest.xml에 usePermission을 작성합니다.

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

 

우선 activity_main.xml을 작성합니다.

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:onClick="startService"
        android:text="start service"
        app:layout_constraintBottom_toTopOf="@+id/button"
        tools:layout_editor_absoluteX="0dp" />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:onClick="stopService"
        android:text="stop service"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_editor_absoluteX="0dp" />
 
 
 

순서는 NetworkCallback -> Service -> MainActivity 으로 만들겠습니다.

 

NetworkCallback 을 상속받는 Class를 만들겠습니다.

 

NetworkConnectionCheck.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
import android.content.Context;
 
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
 
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)    //LOLLIPOP 버전 이상에서 동작
public class NetworkConnectionCheck extends ConnectivityManager.NetworkCallback {   // 네트워크 변경에 대한 알림에 사용되는 Callback Class
 
    private Context context;
    private NetworkRequest networkRequest;
    private ConnectivityManager connectivityManager;
 
    public NetworkConnectionCheck(Context context){
        this.context=context;
        networkRequest =
                new NetworkRequest.Builder()                                        // addTransportType : 주어진 전송 요구 사항을 빌더에 추가
                        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)   // TRANSPORT_CELLULAR : 이 네트워크가 셀룰러 전송을 사용함을 나타냅니다.
                        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)       // TRANSPORT_WIFI : 이 네트워크가 Wi-Fi 전송을 사용함을 나타냅니다.
                        .build();
        this.connectivityManager = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE); // CONNECTIVITY_SERVICE : 네트워크 연결 관리 처리를 검색 
    }
 
    public void register() { this.connectivityManager.registerNetworkCallback(networkRequest, this);}
 
    public void unregister() {
        this.connectivityManager.unregisterNetworkCallback(this);
    }
 
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
 
        // 네트워크가 연결되었을 때 할 동작
        Toast.makeText(this.context, "network available", Toast.LENGTH_SHORT).show();
    }
 
    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
 
        // 네트워크 연결이 끊겼을 때 할 동작
        Toast.makeText(this.context, "network lost", Toast.LENGTH_SHORT).show();
    }
 
 
}
 
 

 

이제 Service를 상속 받는 Class를 만들겠습니다.

MyService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
 
public class MyService extends Service {
    NetworkConnectionCheck networkConnectionCheck;
    public MyService() {
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }// onBind()..
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {    //  LOLLIPOP Version 이상..
            if(networkConnectionCheck==null){
                networkConnectionCheck=new NetworkConnectionCheck(getApplicationContext());
                networkConnectionCheck.register();
            }
        }
        return START_STICKY;    // START_STICKY : 시스템에 의해 종료 되어도 다시 생성 시켜주는 것
    }// onStartCommand() ..
 
    @Override
    public void onDestroy() {
        super.onDestroy();
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {     //  LOLLIPOP Version 이상..
            if(networkConnectionCheck!=null) networkConnectionCheck.unregister();
        }
    }// onDestroy()..
}
 
 

 

이제 MainActivity를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 
 
public class MainActivity extends AppCompatActivity {
 
    MyService myService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    public void startService(View view) {   // 서비스 실행 버튼
        if(myService==null){
            Intent intent = new Intent(this,MyService.class);
            startService(intent);
        }
    }// startService()..
 
    public void stopService(View view) {// 서비스 중지 버튼
        if(myService!=null){
            Intent intent = new Intent(this,MyService.class);
            stopService(intent);
        }
    }// stopService()..
 
}// MainActivity Class..
 
 

 

<실행 화면> 현재 네트워크 접속 유무를 알 수 있습니다. (앱이 종료 되어도, Service 컴퍼넌트 이용)

 

이제 앱을 종료하고 테스트 해봅니다.

( Service로 실행하기 때문에 정상 동작하는 것을 알 수 있습니다. )

알림이 계속 뜨므로, 앱을 실행 시켜서 Stop Service 버튼을 누릅니다.

댓글