오늘은 살짝 힘들었다.
만들고 있는 앱이 계속 말썽을 부렸기 때문이다.
기존에 프래그먼트 A 위에 뷰 페이저를 통해 프래그먼트 B를 올렸는데,
프래그먼트 A에서 B에 있던 버튼을 참조해서 버튼을 누를 일이 생겼는데,
누르게 되면 B에서는 버튼이 반응 없는 것이었다.
그렇다고 같은 코드를 두 프래그먼트에 쓰는 건 오류도 나고,
너무 비효율적이라고 판단하여
B프래그먼트에 있는 코드를 모두 B로 옮기고 몇 가지 수정을 했다.
그런데, 갑자기 뜨는 오류
위와 같은 오류가 뜨는 것이었다.
did not then call Service.startForeground():
Service에서 startForground() 메서드를 호출하지 않았다는 거 같은데,
웃긴 게 앱은 켜졌지만,
한 10초 지나서 앱이 종료가 되었다.
그리고 저렇게 뜬 것이다.
인터넷의 연결여부에 따라 서비스 클래스를 만들어주고,
그에 맞는 ConnectivityManager.NetworkCallback 클래스도 만들어 주어
메시지를 전송해주는 기능을 쓰는 중이다.
아직 이 부분에 대해서 공부를 하지는 못했지만,
해결책만 우선적으로 적어두고,
천천히 이해해 가보려고 한다.
해결책
우선 인터넷 포그라운드 권한 설정을 매니페스트에서 해줘야 한다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.techtown.study01.FirstToMain">
<!--인터넷 포그라운드 권한 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
.... /manifest>
그러고 나서,
서비스로 인텐트로 포그라운드로 전달할 객체를 만들어 준다.
API 26 이상부터는
this.startForegroundService(serviceIntent);
이런 식으로 값을 주고,
그 미만은
this.startService(serviceIntent);
기존에 것을 사용해준다.
아래와 같이 입력해 주면 된다.
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bottom_navi);
//서비스실행 (인터넷이 연결되어 있는지 아닌지 확인해준다.(NetworkConnectionCheck -> MyService -> BottomNavi)) 항상 실행중
Intent serviceIntent = new Intent(this,MyService.class);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ //api level 26부터
this.startForegroundService(serviceIntent); //이 메서드를 쓰고 그게아니면,
}else{
this.startService(serviceIntent); //이것을 쓴다.
}
}
그리고 서비스 클래스로 가서 알림 채널과 그에 맞는 아이디를 만들어준다.
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onCreate() {
String CHANNEL_ID = "channel_1";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Android test",
NotificationManager.IMPORTANCE_LOW);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE))
.createNotificationChannel(channel);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build();
startForeground(2, notification);
}
이렇게 해서 알람을 받을 채널을 앱에다가 만들어줘야 한다고 한다.
아직 이해가 되지 않는 작업이지만,
백그라운드에서 필수적으로 해줘야 할 작업이라는 정도로만
공부해보았다.
이렇게 입력을 하고 나서는 앱이 꺼지지 않고 잘 작동이 되었다.
오늘 공부 끝!