728x90
728x90
안드로이드 서비스
서비스(Service)
일반적으로 화면 없이 동작하는 프로그램으로 백그라운드 프로세스(Background Process)라고도 한다. 액티비티 응용 프로그램은 화면(액티비티)이 종료되면 동작하지 않지만 서비스는 백그라운드에서 실행되므로 화면과 상관없이 계속 동작한다.
서비스 생명 주기
화면이 종료되어도 계속되는 음악 서비스 실습
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btnStart"
android:text="음악서비스 시작"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnStop"
android:text="음악서비스 중지"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
MusicService.java
- Service 클래스의 상속을 받는 MusicService 클래스 정의
package com.example.chapter14_1;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MusicService extends Service {
MediaPlayer mp;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
android.util.Log.i("서비스 테스트", "onCreate()");
super.onCreate();
}
@Override
public void onDestroy() {
android.util.Log.i("서비스 테스트", "onDestroy()");
mp.stop();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
android.util.Log.i("서비스 테스트", "onStartCommand()");
mp = MediaPlayer.create(this, R.raw.song1);
mp.setLooping(true);
mp.start();
return super.onStartCommand(intent, flags, startId);
}
}
MainActivity.java
package com.example.chapter14_1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Intent intent;
Button btnStart, btnStop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("서비스 테스트 예제");
intent = new Intent(this, MusicService.class);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(intent);
android.util.Log.i("서비스 테스트", "startService()");
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopService(intent);
android.util.Log.i("서비스 테스트", "stopService()");
}
});
}
}
AndroidManifest.xml
- uses-sdk와 Service 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chapter14_1">
<uses-sdk
android:targetSdkVersion="16"
android:minSdkVersion="8" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="MusicService">
<intent-filter>
<action android:name="com.example.chapter14_1"></action>
</intent-filter>
</service>
</application>
</manifest>
배터리상태 체크 예제
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ivBattery"
android:layout_gravity="center"
android:src="@drawable/battery_0"/>
<EditText
android:id="@+id/edtBattery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#cccccc"
android:enabled="false"/>
</LinearLayout>
MainActivity.java
package com.example.chapter14_6;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
ImageView ivBattery;
EditText edtBattery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배터리 상태 체크");
ivBattery = (ImageView)findViewById(R.id.ivBattery);
edtBattery = (EditText)findViewById(R.id.edtBattery);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(br);
}
@Override
protected void onPostResume() {
super.onPostResume();
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(br, iFilter);
}
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
int remain = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
edtBattery.append("현재 충전량: "+remain+" %\n");
if(remain >=90)
ivBattery.setImageResource(R.drawable.battery_100);
else if(remain>=70)
ivBattery.setImageResource(R.drawable.battery_80);
else if(remain>=50)
ivBattery.setImageResource(R.drawable.battery_60);
else if(remain>=10)
ivBattery.setImageResource(R.drawable.battery_20);
else
ivBattery.setImageResource(R.drawable.battery_0);
int plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
switch (plug) {
case 0:
edtBattery.append("전원 연결 : 안됨");
break;
case BatteryManager.BATTERY_PLUGGED_AC:
edtBattery.append("전원 연결 : 어댑터 연결됨");
break;
case BatteryManager.BATTERY_PLUGGED_USB:
edtBattery.append("전원 연결 : USB 연결됨");
break;
}
}
}
};
}
728x90
728x90
'Java Friends > Android' 카테고리의 다른 글
안드로이드 콘텐트 프로바이더 (0) | 2019.08.22 |
---|---|
안드로이드 방송수신자 (브로드캐스트 리시버) (0) | 2019.08.22 |
안드로이드 네트워크 연결해 CRUD (입력, 수정, 추가, 삭제) 실습 (0) | 2019.08.21 |
안드로이드 구구단 맞추기 (0) | 2019.08.20 |
안드로이드 어댑터뷰 개념과 예제 (0) | 2019.08.19 |