백그라운드 동작 (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))
'프로그래밍 > Android (Java)' 카테고리의 다른 글
서비스 (service) 가동 여부 확인하기 (0) | 2019.07.12 |
---|---|
Notification 진동 제거하기 (0) | 2019.07.10 |
SQLite3 사용예제 (0) | 2019.07.08 |
[알림] addPreferencesFromResource 줄 처져 있을 때 (0) | 2019.07.04 |
TextView 줄간격, 자간, 장평 변경하기 (0) | 2019.07.02 |