달달한 스토리

728x90
반응형

 

오늘은 살짝 힘들었다.

 

만들고 있는 앱이 계속 말썽을 부렸기 때문이다.

 

기존에 프래그먼트 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);
    }

이렇게 해서 알람을 받을 채널을 앱에다가 만들어줘야 한다고 한다.

 

아직 이해가 되지 않는 작업이지만,

 

백그라운드에서 필수적으로 해줘야 할 작업이라는 정도로만 

 

공부해보았다.

 

이렇게 입력을 하고 나서는 앱이 꺼지지 않고 잘 작동이 되었다.

 

오늘 공부 끝!

 

 

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading