Android에서 Service 종료 방법 및 기능 설명
의혹 해결:
1. 서비스는 분리된 프로세스가 아니다. 다른 특수한 경우를 제외하고는 자신의 프로세스에서 실행되지 않고 시작된다.
프로세스의 일부분을 실행합니다.
2. 서비스는 스레드가 아닙니다. 즉, 기본 스레드에서 작동합니다.
서비스를 시작하려면 다음 두 가지 방법이 있습니다.
1、 Context.startService()
호출자와 서비스 사이에 관련이 없습니다. 호출자가 종료되더라도 서비스는 실행될 수 있습니다
2、 Context.bindService()
호출자는 서비스와 연결되어 있으며, 호출자는 일단 퇴장하면 서비스도 종료된다
서비스 라이프 사이클
startService()를 사용하여 서비스를 시작하면, 시스템은 전송된 Intent를 통해 밑에 있는 Intent에 맞는 메시지를 검색합니다
이자 서비스.서비스가 시작되지 않으면 onCreate를 실행하고 onStartCommand를 실행합니다.
Stop Service나 stopSelf가 뚜렷하게 호출될 때까지 Intent와 다른 매개 변수를 사용합니다.
startService를 몇 번 실행하든지 간에 stopService나 stopSelf를 한 번 호출하면 서비스가 정지됩니다.사용
stopSelf (int) 방법은 intent를 처리한 후에 멈출 수 있습니다.
서비스의 운행을 제어하는 주요 방식은 두 가지가 있는데 주로 onStartCommand 방법에 따라 되돌아오는 수치이다.방법:
1、START_STICKY
2、START_NOT_STICKY or START_REDELIVER_INTENT
여기서는 주로 이 세 변수의 의미를 설명한다.
1、 START_STICKY
onStartCommand를 실행한 후 서비스 프로세스가kill되면 시작 상태로 유지되지만, 그것들을 보류하지 않습니다
들어오는 intent입니다.머지않아 서비스는 다시 만들려고 시도할 것입니다. 왜냐하면 시작 상태에서 서비스를 만들고 있기 때문입니다.
이후에는 onstartCommand가 호출됩니다.서비스에 시작 명령을 전달하지 않으면null의
intent
2、 START_NOT_STICKY
onStartCommand를 실행한 후 서비스 프로세스가kill에 전달되었고 새로운 intent가 전달되지 않았습니다.서비스 제거
상태를 시작하고 새로운 뚜렷한 방법 (start 서비스) 이 호출될 때까지 다시 만들 수 없습니다.왜냐하면 전달이 안 됐으면...
결정된 intent 그러면 서비스가 시작되지 않습니다. 즉, 그 동안onstart Command는 어떤null도 받지 않습니다.
intent.
3、 START_REDELIVER_INTENT
onStartCommand를 실행한 후 서비스 프로세스가kill에 의해 실행되면 시스템은 서비스를 다시 시작하여 마지막 서비스로 전송합니다
intent 는 onstart Command 에 부여됩니다.intent 전달을 중지하려면 stopSelf (int) 를 호출해야 합니다.하면, 만약, 만약...
처리된 intent는 킬을 받은 후에도 서비스가 자동으로 시작됩니다.따라서 onstartCommand는 null을 받지 않습니다.
의 intent입니다.
클라이언트도 bindService를 사용하여 서비스와 지속적으로 연결할 수 있습니다.명심해라: 만약 이런 방법을 사용한다면, 호출되지 않을 것이다
onstartCommand(startService와 달리 아래의 예와 주석도 해석되어 있으니 시험해 보십시오).클라이언트가
onBind 콜백에서 Ibinder 인터페이스가 반환되는 객체를 수신합니다.보통 Ibinder는 복잡한 인터페이스로서 aidl 수를 되돌려줍니다
근거
Service는 start와 bind를 함께 사용할 수도 있습니다.
사용 권한
서비스를 실행하려면 먼저 AndroidManifest에 있어야 합니다.xml에 <서비스> 탭을 표시합니다.
Service는 개인의 IPC 호출을 보호하기 때문에 이 호출을 실행하기 전에 checkCallingPermission (String) 을 사용합니다.
방법은 이 권한이 있는지 검사합니다.
프로세스 라이프 사이클
서비스가 낮은 메모리 환경에서 실행될 때 존재하는 프로세스를 킬합니다.따라서 프로세스의 우선 순위가 중요합니다.
1. 만약에 서비스가 현재 onCreate, onStartCommand, onDestroy 방법을 실행하고 있다면 메인 프로세스는
kill을 피하기 위해 코드가 실행될 수 있도록 데스크톱 프로세스가 보장합니다
2. 서비스가 시작되면 메인 프로세스는 다른 보이는 프로세스보다 중요성이 낮지만 다른 보이지 않는 프로세스보다
높다최소한의 프로세스만 사용자가 볼 수 있기 때문에, 극도로 낮은 메모리를 사용할 때만 서비스가
킬한테.
3. 만약에 클라이언트가 서비스와 관련이 있다면 서비스는 클라이언트보다 영원히 중요하다.즉 클라이언트가 볼 수 있다면 서비스는
도 알 수 있다.
4. 서비스는 startForeground API를 사용하여 서비스를 프론트 데스크 상태로 전환할 수 있습니다.이렇게 하면 낮은 메모리에서 킬을 받을 확률이 더 높아요.
낮지만 문서 뒤에 극도로 낮은 메모리의 압력 아래서도 이 서비스는 이론적으로kill에 의해 떨어진다고 쓰여 있다.
하지만 이 상황은 기본적으로 고려할 필요가 없다.
물론 서비스가 kill에 의해 유지된다면, onStart Command 반환 변수를 다시 써서 시작할 수 있습니다
방식.예: STARTSTICKY、START_REDELIVER_INTENT 등등, 앞에서 그들의 역할에 대해 논의했는데, 여기
더 이상 군더더기가 없다
또한:
서비스의 onCreate와 onStartCommand는 주 라인에서 실행되기 때문에 시간이 걸리는 작업을 처리할 수 있습니다.
두 가지 프로세싱:
1、그것들을 모두 새로운 라인으로 옮겨 주세요.
2. 시스템이 제공하는 IntentService로 서비스를 계승하고 데이터 처리는 자신이 새로 시작한 라인으로 한다.
서비스 종료 시작 실례
====================main 파일=============================
package com.services.coms;
import java.io.FileFilter;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;import android.content.Intent;
import android.content.IntentFilter;import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;import android.widget.TextView;
import android.widget.Toast;
public class MainService extends Activity {
private TextView textviewService;
private Button buttonStart ,buttonStop;
public static final int CMD_STOP_SERVICE = 0;
DataReceiver dateReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textviewService=(TextView)findViewById(R.id.textservice);
buttonStart=(Button)findViewById(R.id.buttonstart);
buttonStop=(Button)findViewById(R.id.buttonstop);
buttonStart.setOnClickListener(buttonClick);
buttonStop.setOnClickListener(buttonClick);
}
private View.OnClickListener buttonClick =new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v==buttonStart){
Intent intentService=new Intent(MainService.this,MyService.class);
startService(intentService);
Log.i("onStartCommand", "OnClickListener=");
}else if(v==buttonStop){
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("cmd",CMD_STOP_SERVICE);
sendBroadcast(intent);
}
}
};
private class DataReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("onStartCommand", " ="+intent.getStringExtra("data"));
String Date=intent.getStringExtra("data");
textviewService.setText(Html.fromHtml("<font color='#0066CC'><u>"+"Service :"+Date+"</font>"));
}
}
@Override protected void onStart() {
dateReceiver=new DataReceiver();
IntentFilter intentfilter=new IntentFilter();
// IntentFilter
intentfilter.addAction("AAAAA");
registerReceiver(dateReceiver, intentfilter);
// Broadcast Receiver
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(dateReceiver);
// Broadcast Receiver
super.onStop();
}
}
===================서비스 파일=========================
package com.services.coms;
import java.util.UUID;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.IBinder;import android.util.Log;
public class MyService extends Service {
CommandReceiver cmdReceiver;
boolean flag;
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
@Override
public void onCreate() {
cmdReceiver=new CommandReceiver();
flag=true;
Log.i("onStartCommand", "onCreate=");
super.onCreate();
}
@Override
public void onDestroy() {
this.unregisterReceiver(cmdReceiver);
// BroadcastReceiver
super.onDestroy();
}
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
}
@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand", "onStartCommand=");
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("AAAAA");
registerReceiver(cmdReceiver, intentFilter);
doJob();
//
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//
private class CommandReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int cmd=intent.getIntExtra("cmd", -1);
if(cmd==MainService.CMD_STOP_SERVICE){
// 0
flag=false;//
stopSelf();//
}
}
}
public void doJob(){
new Thread(){
@Override
public void run() {
while(flag){
// ==true
try {
Thread.sleep(1000);// 1
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("onStartCommand", "run=");
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("data",UUID.randomUUID()+"");
sendBroadcast(intent);// aaaaa data
}
}
}.start();
}
}
===================layout 파일==============================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textservice" />
<Button
android:id="@+id/buttonstart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" "
android:gravity="center"/>
<Button
android:id="@+id/buttonstop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" "
android:gravity="center"/>
</LinearLayout>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.