##01_start開啟服務的生命周期(重點)
* 服務的特點:
服務被創(chuàng)建時調用onCreate、onStartCommand;
服務只能被創(chuàng)建一次,可以開啟多次onStartCommand;
服務只能被停止一次onDestroy;
沒有onPause、onStop、onResume、onRestart方法,因為service沒有界面,長期運行在后臺。
* 生命周期的方法:
onCreate:服務被創(chuàng)建的時候調用這個方法;
onStartCommand :開啟服務;
onDestroy:銷毀服務;
##02_bind方式開啟服務的生命周期(重點)
bindService、unbindService的特點:
1、第一次綁定服務時,先創(chuàng)建服務對象,在綁定,調用了oncreate onbind;
2、解除綁定的服務時,調用onUnbind、onDestroy;
3、服務只能被幫頂一次;
4、服務只能被解除一次,多次解除程序會拋出異常;
5、使用bindservice方式開啟的服務,會隨著界面的退出而解除綁定并且銷毀服務對象;
生命周期:
1、第一次綁定服務時創(chuàng)建服務對象:onCreate、onbind;
2、界面關閉時銷毀服務對象:onUnbind、onDestroy;
推薦的混合方式:
1、startService:可以讓服務長期運行在后臺;
2、bindService:綁定服務,為了調用服務的業(yè)務邏輯方法;
3、unbindService:解除綁定,不能在調用服務里業(yè)務邏輯方法;
4、stopService:停止服務,銷毀服務對象;
##03_為什么要引入bindservice的API
目的:為了調用服務中業(yè)務邏輯方法:
##04_綁定服務調用服務方法的過程
通過中間人調用服務里面的業(yè)務邏輯方法:
1、在服務中添加一個中間人的類,這個類繼承了Binder,Binder實現了IBinder接口,所以中間人就是一個IBinder的實現類;
2、在綁定服務時調用的onBind方法返回中間人對象;
3、在activity中綁定服務成功時獲取中間人對象;
4、在activity中調用中間人的方法(這個方法中調用服務的業(yè)務邏輯方法);
代碼:
MainActivity.java:
package com.itheima.bindservice;
import com.itheima.bindservice.TestService.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.view.View;
public class MainActivity extends Activity {
private MyConn conn;
private Intent intent;
//中間人對象
private MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void call(View view) {
myBinder.callMethodInService();
}
public void start(View view) {
intent = new Intent(this, TestService.class);
startService(intent);
}
public void stop(View view) {
stopService(intent);
}
public void bind(View view) {
conn = new MyConn();
// 綁定服務
// intent開啟服務的意圖對象
// MyConn在activity與service之間創(chuàng)建的一個連接,作為通訊的渠道
// BIND_AUTO_CREATE 綁定服務時如果服務不存在,就會縣創(chuàng)建一個服務對象,然后在綁定
bindService(intent, conn, BIND_AUTO_CREATE);
}
public void unbind(View view) {
//解除綁定
unbindService(conn);
}
private class MyConn implements ServiceConnection {
/**
* 服務綁定成功后調用這個方法
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyBinder) service;
}
/**
* 解除服務成功時調用這個方法
*/
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
TestService.java:
package com.itheima.bindservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class TestService extends Service {
/*
* 綁定服務的時候會調用這個方法
* return : 綁定服務成功后返回一個IBinder類型的數據對象
*/
@Override
public IBinder onBind(Intent arg0) {
System.out.println("--------onBind---------");
return new MyBinder();
}
/**
* 解除綁定的服務時調用這個方法
*/
@Override
public boolean onUnbind(Intent intent) {
System.out.println("--------onUnbind---------");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
System.out.println("--------onCreate---------");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("--------onDestroy---------");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("--------onStartCommand---------");
return super.onStartCommand(intent, flags, startId);
}
/**
* 業(yè)務邏輯方法
*/
public void methodInService(){
System.out.println("========methodInService========");
}
/**
* 中間人,
* @author Administrator
*
*/
public class MyBinder extends Binder{
public void callMethodInService(){
//調用業(yè)務邏輯方法
methodInService();
}
}
}
##05_綁定服務抽取接口(重點)
接口的作用:對外暴露功能,隱藏實現的細節(jié);
步驟:
1、創(chuàng)建一個接口,里面寫一個方法(對外暴露的方法):
2、在服務類里面,讓中間人實現這個接口,并且實現接口中方法,在實現的方法中調用服務的業(yè)務邏輯方法;
3、在activity中綁定服務成功時,得到接口類型的中間人對象;
4、在activity中調用中間人的方法;
代碼:
MainActivity.java:
package com.itheima.bindservice;
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.view.View;
public class MainActivity extends Activity {
private MyConn conn;
private Intent intent;
//中間人對象
private IService myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void call(View view) {
myBinder.callMethodInService();
}
public void start(View view) {
intent = new Intent(this, TestService.class);
startService(intent);
}
public void stop(View view) {
stopService(intent);
}
public void bind(View view) {
conn = new MyConn();
// 綁定服務
// intent開啟服務的意圖對象
// MyConn在activity與service之間創(chuàng)建的一個連接,作為通訊的渠道
// BIND_AUTO_CREATE 綁定服務時如果服務不存在,就會縣創(chuàng)建一個服務對象,然后在綁定
bindService(intent, conn, BIND_AUTO_CREATE);
}
public void unbind(View view) {
//解除綁定
unbindService(conn);
}
private class MyConn implements ServiceConnection {
/**
* 服務綁定成功后調用這個方法
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (IService) service;
}
/**
* 解除服務成功時調用這個方法
*/
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
TestService.java:
package com.itheima.bindservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class TestService extends Service {
/*
* 綁定服務的時候會調用這個方法
* return : 綁定服務成功后返回一個IBinder類型的數據對象
*/
@Override
public IBinder onBind(Intent arg0) {
System.out.println("--------onBind---------");
return new MyBinder();
}
/**
* 解除綁定的服務時調用這個方法
*/
@Override
public boolean onUnbind(Intent intent) {
System.out.println("--------onUnbind---------");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
System.out.println("--------onCreate---------");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("--------onDestroy---------");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("--------onStartCommand---------");
return super.onStartCommand(intent, flags, startId);
}
/**
* 業(yè)務邏輯方法
*/
public void methodInService(){
System.out.println("========methodInService========");
}
/**
* 中間人,
* @author Administrator
*
*/
private class MyBinder extends Binder implements IService{
//實現接口中方法
public void callMethodInService(){
//調用業(yè)務邏輯方法
methodInService();
}
public void eat(){
System.out.println("=======eat======");
}
public void sn(){
System.out.println("=======sn======");
}
public void ktv(){
System.out.println("=======ktv======");
}
}
}
##06_服務的應用場景
應用場景:需要在后臺運行一個程序,需要與服務器端通訊數據;
常見的服務應用場景:天氣預報、股票軟件;
##07_利用服務注冊廣播接收者
使用代碼注冊廣播接收者原因:操作比較頻繁的事件,在激活廣播接收者時,需要去讀取清單文件,解析xml格式的數據,這個過程占用的資源比較大,耗時較長。
使用代碼注冊的廣播接收者,啟動的時候比較快。
工程代碼:
* 配置文件:
* 代碼:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,ScreenReceiverService.class);
startService(intent);
}
}
ScreenReceiverService.java:
package com.itheima.coderegistreceiver;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
public class ScreenReceiverService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 1、創(chuàng)建一個廣播接收者的對象
ScreenBroadcastreceiver receiver = new ScreenBroadcastreceiver();
// 2、為廣播接收者創(chuàng)建意圖過濾器
IntentFilter filter = new IntentFilter();
// 3、在意圖過濾器中設置廣播接收者需要接收的事件類型
filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");
// 4、注冊廣播接收者
this.registerReceiver(receiver, filter);
}
}
##08_遠程服務aidl的寫法(重點)
遠程服務:在同一個設備上安裝的其他應用程序,包含一個服務的應用程序。
本地服務:在自己的應用程序中寫另一個服務的類;
aidl: Android Interface Definition language 安卓的接口定義語言;
這個格式的文件,就是對外共享的接口的文件,可以把這個文件拷貝任何工程里,可以調用遠程服務的接口;
IPC: Inter Process Communication 進程間的通訊;
在本地應用程序中調用遠程的服務接口:
步驟:
1、寫遠程的工程,寫一個服務;
(1)創(chuàng)建一個服務類,重寫了onBind方法;
(2)在服務類里寫了一個中間人,繼承了Binder;
(3)寫一個接口類,對外暴露了一個方法;
(4)在服務類里讓中間人實現了這個接口,重寫接口的方法(在這個方法里面調用服務的業(yè)務邏輯方法);
(5)修改IService類的格式,改成aidl格式(讓它作為一個對外開放的共享接口文件);
(6)讓中間人繼承Stub;
2、創(chuàng)建一個本地應用程序,調用遠程的服務接口:
(1)創(chuàng)建一個與遠程服務相同的包名,然后把aidl文件拷貝到這個包里;
(2)在activity中綁定服務成功時得到IService類型的中間人;
(3)在activity中調用中間人的方法;
遠程服務:
package com.itheima.remoteservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.itheima.remoteservice.IService.Stub;
public class RemoteService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("=========onBind============");
return new MyBinder();
}
public void methodInService(){
System.out.println("================methodInService===========");
}
//中間人 繼承 Stub,能夠是進程間的通訊
private class MyBinder extends Stub{
@Override
public void callMethodInService() {
//調用服務的業(yè)務邏輯方法
methodInService();
}
}
}
本地應用程序:
package com.itheima.localapp;
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.os.RemoteException;
import android.view.View;
import com.itheima.remoteservice.IService;
import com.itheima.remoteservice.IService.Stub;
public class MainActivity extends Activity {
private IService myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void bind(View view ){
Intent intent = new Intent();
intent.setAction("com.itheima.remoteservice.REMOTESERVICE");
//綁定服務
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
}
public void call(View view ){
try {
//調用遠程服務接口的方法
myBinder.callMethodInService();
} catch (RemoteException e) {
e.printStackTrace();
}
}
private class MyConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//把中間人作為接口來使用
myBinder = Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
創(chuàng)新互聯(lián)建站-專業(yè)網站定制、快速模板網站建設、高性價比瑪納斯網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式瑪納斯網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋瑪納斯地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。