Android 에서 Service 서비스의 기초 지식 및 작성 방법 에 대해 자세히 알 아 보기
서 비 스 는 안 드 로 이 드 시스템 의 서비스 입 니 다.사용자 와 직접 상호작용 을 할 수 없고 사용자 나 다른 프로그램 에서 시작 해 야 합 니 다.우선 순위 가 높 습 니 다.프론트 에 있 는 응용 보다 우선 순위 가 낮 지만 배경 에 있 는 다른 응용 보다 우선 순위 가 높 습 니 다.이 는 시스템 이 메모리 가 부족 해서 이용 되 지 않 은 자원 을 없 앨 때 소 각 될 확률 이 매우 적다 는 것 을 결정 한다.
그럼 언제 서 비 스 를 사용 해 야 합 니까?
서 비 스 는 백 스테이지 에서 실행 되 는 애플 리 케 이 션 으로 사용자 에 게 주 목 받 는 초점 을 잃 었 다 는 것 을 잘 알 고 있 습 니 다.이것 은 우리 와 음악 을 틀 어 놓 은 후에 그림 을 보 러 가 고 싶 습 니 다.이때 우 리 는 음악 이 멈 추고 싶 지 않 습 니 다.여 기 는 service 를 사용 할 것 입 니 다.또 예 를 들 어 우리 가 다운로드 링크 를 연 후에 우 리 는 눈 을 부 릅 뜨 고 그 가 다운로드 한 후에 다른 일 을 하고 싶 지 않 을 것 이다.그렇지?이때 만약 에 우리 가 핸드폰 을 백 스테이지 에서 다운로드 하면 서 뉴스 같은 것 을 보 여 주 려 면 service 를 사용 해 야 한다.
서비스 분류:
일반적으로 서 비 스 는 로 컬 서비스 와 원 격 서비스 로 나 뉜 다 고 생각 합 니 다.
1.로 컬 서비스:말 그대로 현재 같은 프로 세 스에 적용 되 고 있 는 서비스 입 니 다.서로 공 통 된 메모리 영역 을 가지 고 있 기 때문에 일부 데이터 공유 에 특히 편리 하고 간단 합 니 다.
2.원 격 서비스:주로 서로 다른 프로 세 스 간 의 서비스 접근 과 관련된다.안 드 로 이 드 의 시스템 보안 때문에 우 리 는 서로 다른 프로 세 스 간 에 일반적인 방식 으로 데 이 터 를 공유 할 수 없습니다.여기 안 드 로 이 드 가 AIDL 도 구 를 제공 합 니 다.(android interface description language)android 인터페이스 설명 언어.뒤에서 우 리 는 그것 에 대해 상세 하 게 소개 할 것 이다.
서비스 시작 프로 세 스
context.startService()시작 프로 세 스:
context.startService() -> onCreate() -> onStart() -> Service running -> context.stopService() -> onDestroy() -> Service stop
서비스 가 실행 되 지 않 았 다 면 안 드 로 이 드 는 onCreate()를 먼저 호출 한 다음 onStart()를 호출 합 니 다.
Service 가 실행 되 었 다 면 onStart()만 호출 되 기 때문에 하나의 Service 의 onStart 방법 은 여러 번 중복 호출 될 수 있 습 니 다.
stopService 를 사용 할 때 on Destroy 를 직접 사용 합 니 다.호출 자가 직접 종료 하고 stopService 를 사용 하지 않 으 면 Service 는 계속 배경 에서 실 행 됩 니 다.이 Service 의 호출 자 는 다시 시작 하면 stopService 를 통 해 서 비 스 를 닫 을 수 있 습 니 다.
그래서 startService 를 호출 하 는 생명 주 기 는:onCreate-->onStart(여러 번 호출 가능)-->onDestroy 입 니 다.
context.bindService()시작 프로 세 스:
context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop
onBind()는 클 라 이언 트 에 게 IBind 인터페이스 인 스 턴 스 를 되 돌려 줍 니 다.IBind 는 클 라 이언 트 가 서 비 스 를 되 돌려 주 는 방법 을 허용 합 니 다.예 를 들 어 Service 의 인 스 턴 스,실행 상태 또는 다른 작업 을 받 을 수 있 습 니 다.이 럴 때 호출 자(Context,예 를 들 어 Activity)를 Service 와 연결 하고 Context 가 종료 되면 Srevice 는 onUnbid->onDestroy 를 호출 하여 종료 합 니 다.
그래서 bindService 를 호출 하 는 생명 주 기 는:onCreate-->onBind(한 번 만,여러 번 연결 할 수 없습니다)-->onUnbind-->onDestory 입 니 다.
Service 가 열 릴 때마다 닫 히 는 과정 에서 onStart 만 여러 번 호출 될 수 있 습 니 다(여러 번 startService 를 통 해 호출 됨).다른 onCreate,onBind,onUnbind,onDestory 는 한 생명 주기 에 한 번 만 호출 될 수 있 습 니 다.
서비스 수명 주기:
Activity 에 비해 service 의 생명 주 기 는 더 이상 간단 할 수 없습니다.onCreate()->onStart()->onDestroy()세 가지 방법 만 있 습 니 다.
Activity 에서 service 와 관련 된 방법:
/**
* service 。
* name service
* service service onBund IBinder,
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(" ", " !");
MyBinder binder = (MyBinder)service;
MyService myService = binder.getMyService();
int count = myService.getCount();
Log.i(" ", "count="+count);
}
서비스 사용 절차:
STEP 1:우 리 는 service 류 를 계승 하여 자신의 service 를 실현 해 야 한다.
service 의 일부 값 에 접근 하려 면 Binder 를 계승 한 내부 클래스 를 제공 합 니 다.onBund()방법 을 통 해 service 요청 에 되 돌려 줍 니 다.이곳 은 실제 적 으로 내부 류 가 외부 류 속성 에 접근 할 수 있 는 특징 을 교묘 하 게 이용 했다.
두 번 째 단계:android Manifest.xml 에 등록 합 니 다.예 를 들 어:
<!--
service
-->
<service android:name="MyService"></service>
<!--
service
-->
세 번 째 단계:activity 에서 시작,바 인 딩,해제 또는 서 비 스 를 중단 합 니 다.(많은 책 에서 서비스 와 사용 자 는 상호작용 을 할 수 없다 고 하 는데 사실은 이 말 이 정확 하지 않 습 니 다.우 리 는 activity 와 서 비 스 를 통 해 상호작용 을 할 수 있 잖 아 요!나 는 확실한 설 은 서비스 와 사용자 가 직접적인 상호작용 을 할 수 없다 는 것 이 라 고 생각한다.
예시
다음은 service 를 호출 하여 음악 을 듣 는 예 를 제공 합 니 다.
activity 코드:
package cn.com.chenzheng_java;
import cn.com.chenzheng_java.MyService.MyBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
* @description service
*/
public class ServiceActivity extends Activity implements OnClickListener{
private Button button_start ;
private Button button_bind ;
private Button button_destroy ;
private Button button_unbind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service);
button_start = (Button) findViewById(R.id.button1_service);
button_bind = (Button) findViewById(R.id.button2_service);
button_destroy = (Button) findViewById(R.id.button3_service);
button_unbind = (Button) findViewById(R.id.button4_service);
button_start.setOnClickListener(this);
button_bind.setOnClickListener(this);
button_destroy.setOnClickListener(this);
button_unbind.setOnClickListener(this);
}
private class MyServiceConnection implements ServiceConnection{
/**
* service 。
* name service
* service service onBund IBinder,
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(" ", " !");
MyBinder binder = (MyBinder)service;
MyService myService = binder.getMyService();
int count = myService.getCount();
Log.i(" ", "count="+count);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(" ", " !");
}
}
private MyServiceConnection serviceConnection = new MyServiceConnection();
@Override
public void onClick(View v) {
if(v == button_start){
Intent intent = new Intent();
intent.setClass(getApplicationContext(), MyService.class);
startService(intent);
}
if(v == button_bind){
Intent intent = new Intent();
intent.setClass(getApplicationContext(), MyService.class);
bindService(intent,serviceConnection , BIND_AUTO_CREATE);
}
if(v==button_destroy){
Intent intent = new Intent();
intent.setClass(getApplicationContext(), MyService.class);
stopService(intent);
}
if(v==button_unbind){
unbindService(serviceConnection);
}
}
}
서 비 스 를 계승 하 는 클래스:
package cn.com.chenzheng_java;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/**
* @description service
* @author chenzheng_java
* @since 2011/03/18
*/
public class MyService extends Service {
MediaPlayer mediaPlayer;
/**
* bindService IBinder , , service
*/
@Override
public IBinder onBind(Intent intent) {
Log.i(" ", "service !");
return new MyBinder();
}
@Override
public void onCreate() {
Log.i(" ", "service !");
mediaPlayer = MediaPlayer.create(this, R.raw.aiweier);
mediaPlayer.setLooping(false);
super.onCreate();
}
@Override
public void onDestroy() {
mediaPlayer.stop();
Log.i(" ", "service !");
super.onDestroy();
}
@Override
public void onRebind(Intent intent) {
Log.i(" ", "service !");
super.onRebind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
mediaPlayer.start();
Log.i(" ", "service start !");
super.onStart(intent, startId);
}
@Override
public boolean onUnbind(Intent intent) {
mediaPlayer.stop();
Log.i(" ", "service !");
return super.onUnbind(intent);
}
private int count = 100;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public class MyBinder extends Binder {
/**
* @return service
*/
MyService getMyService() {
return MyService.this;
}
}
}
service.xml 코드:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:text=" " android:id="@+id/button1_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text=" " android:id="@+id/button2_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text=" " android:id="@+id/button3_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text=" " android:id="@+id/button4_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
androidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.com.chenzheng_java"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="ServiceActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--
service
-->
<service android:name="MyService"></service>
<!--
service
-->
</application>
</manifest>
최종 효과 도:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.