NetworkCallback에 자세한 사항은 아래 안드로이드 개발자 사이트를 참고 바랍니다.
https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback
앱을 꺼도 확인을 하기 위해서 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"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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 android.net.Network;
import android.net.NetworkRequest;
import android.os.Build;
import android.widget.Toast;
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
|
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
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
|
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
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 버튼을 누릅니다.
'안드로이드 > 개발자 일상' 카테고리의 다른 글
안드로이드 실제 디바이스 사이즈 구하기 (xml에 dp값) (8) | 2020.03.28 |
---|---|
안드로이드 Splash (로딩화면) (2) | 2020.03.27 |
안드로이드 WifiManager (내 위치 기반 와이파이 검색하기) (20) | 2020.03.24 |
안드로이드 설정 화면 띄우기 ( 폰에 원래 있는 Setting 화면들 ) (3) | 2020.03.24 |
안드로이드 Retrofit2+RecyclerView 1-1(영화진흥위원회 오픈 API 이용) (6) | 2020.03.22 |
댓글