백그라운드 동작 (service + notification)

반응형

MyService.java

import android.app.Notification;

import android.app.NotificationChannel;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.app.Service;

import android.content.Intent;

import android.os.Build;

import android.os.IBinder;

import android.support.annotation.Nullable;

import android.support.v4.app.NotificationCompat;

 

public class MyService extends Service {

    public static final String CHANNEL_ID = "ForegroundServiceChannel";

 

    @Override

    public void onCreate() {

        super.onCreate();

 

          // 이 부분에 추가하는 내용은 백그라운드에서 실행이 된다.

 

    }

 

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        String input = intent.getStringExtra("inputExtra");

        createNotificationChannel();

        Intent notificationIntent = new Intent(this, MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,

                0, notificationIntent, 0);

 

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)

                .setContentTitle("Foreground Service")

                .setContentText(input)

                .setSmallIcon(R.drawable.ic_launcher)

                .setContentIntent(pendingIntent)

                .build();

 

        startForeground(1, notification);

 

        //do heavy work on a background thread

 

 

        //stopSelf();

 

        return START_NOT_STICKY;

    }

 

    @Override

    public void onDestroy() {

        super.onDestroy();

    }

 

    @Nullable

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }

 

    private void createNotificationChannel() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel serviceChannel = new NotificationChannel(

                    CHANNEL_ID,

                    "Foreground Service Channel",

                    NotificationManager.IMPORTANCE_DEFAULT

            );

 

            NotificationManager manager = getSystemService(NotificationManager.class);

            manager.createNotificationChannel(serviceChannel);

        }

    }

}

 

 

MainActivity.java 에서 버튼 누를때 또는 백버튼으로 종료시에 활용하도록 한다.

startService(new Intent(MainActivity.this, MyService.class)); // 서비스 시작

stopService(new Intent(MainActivity.this, MyService.class)); // 서비스 중지

 

AndroidManifest.xml 의 application 안에 아래 내용 추가

<service

    android:name=".MyService"

    android:enabled="true"

    android:exported="true" />

 

내용 추가 =================

 

1) '안드로이드 위젯으로 앱 들어갈 때 액티비티가 쌓이는 현상' 해결 방법

 

(1) Notification 에서 앱으로 들어올때 아래 코드 사용 (MyService.java)

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);

 

(2) 돌아올 Activity (보통 MainActivity.java) 에 아래 소스 추가

if (!isTaskRoot()) {

    finish();

    return;

}

stopService(new Intent(MainActivity.this, MyService.class)); // 알림바 아이콘 없애기 (필요에 따라 사용)

 

2. setContentText 에 여러줄을 사용하고자 할 경우 아래와 같은 형식으로 대체하면 됩니다.

 

.setStyle(new NotificationCompat.BigTextStyle().bigText("시간 : " + getDate + "\n상태 : " + status))

 

 

[출처] https://myksb1223.github.io/develop_diary/2018/08/12/Activity-is-stacked-when-home-screen-widgets-is-clicked.html

 

반응형

댓글()