728x90
Android Service란 쉽게 말해서 백그라운드에서 동작하는 기능을 말하는 겁니다. 대표적인 예로는 카카오톡 앱을 실행하지 않고도 누군가 메세지를 보내면 받고 알려주는 것이 있습니다.
예제 시나리오는 서비스안에 즉 안드로이드 백그라운드에 쓰레드(핸들러포함)를 생성하여 10초를 세고 핸들러에게 메세지를 전달합니다. 그리고 알람(Notification)을 가지고 있는 핸들러는 메세지를 받고 알람을 발생시킵니다.
1. MainActivity.class
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btnStart, btnEnd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button)findViewById(R.id.btn_start);
btnEnd = (Button)findViewById(R.id.btn_end);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Service 시작",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
btnEnd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Service 끝",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);
}
});
}
}
먼저 mainactivity에서는 서비스를 키고 끌수 있는 버튼을 만들었습니다.
2. ServiceThread
package com.example.myapplication;
import android.os.Handler;
public class ServiceThread extends Thread{
Handler handler;
boolean isRun = true;
public ServiceThread(Handler handler){
this.handler = handler;
}
public void stopForever(){
synchronized (this) {
this.isRun = false;
}
}
public void run(){
//반복적으로 수행할 작업을 한다.
while(isRun){
handler.sendEmptyMessage(0);//쓰레드에 있는 핸들러에게 메세지를 보냄
try{
Thread.sleep(10000); //10초씩 쉰다.
}catch (Exception e) {}
}
}
}
백그라운드에 수행할 스레드 클래스를 작성해준다.
3.Myservice
manifest에 서비스를 만들고,
package com.example.myapplication;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
NotificationManager Notifi_M;
ServiceThread thread;
Notification Notifi ;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notifi_M = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
myServiceHandler handler = new myServiceHandler();
thread = new ServiceThread(handler);
thread.start();
return START_STICKY;
}
//서비스가 종료될 때 할 작업
public void onDestroy() {
thread.stopForever();
thread = null;//쓰레기 값을 만들어서 빠르게 회수하라고 null을 넣어줌.
}
class myServiceHandler extends Handler {
@Override
public void handleMessage(android.os.Message msg) {
Intent intent = new Intent(MyService.this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MyService.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
Notifi = new Notification.Builder(getApplicationContext())
.setContentTitle("Content Title")
.setContentText("Content Text")
.setTicker("알림!!!")
.setSmallIcon(R.drawable.icon)
.setContentIntent(pendingIntent)
.build();
//소리추가
Notifi.defaults = Notification.DEFAULT_SOUND;
//알림 소리를 한번만 내도록
Notifi.flags = Notification.FLAG_ONLY_ALERT_ONCE;
//확인하면 자동으로 알림이 제거 되도록
Notifi.flags = Notification.FLAG_AUTO_CANCEL;
Notifi_M.notify( 777 , Notifi);
//토스트 띄우기
Toast.makeText(MyService.this, "뜸?", Toast.LENGTH_LONG).show();
}
};
}
1. onCreate() : 최초 생성되었을때 한번 실행됩니다.
2. onStartComand() : 백그라운드에서 실행되는 동작들이 들어가는 곳입니다.
3. onDestroy() : 서비스가 종료될 때 실행되는 함수가 들어갑니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] Bottom Navigation 만들기 (0) | 2021.08.18 |
---|---|
[JAVA] 경과 시간 구하기 (0) | 2021.08.16 |
[JAVA][Android] 버튼으로 notification 알림 띄우기 (0) | 2021.08.10 |
[JAVA][Android] 버튼으로 프래그먼트 전환하기 (0) | 2021.08.08 |
[JAVA][Android] 자바 정규 표현식 (유효성 검사) 사용법 & 예제 (0) | 2021.08.07 |