java+整合handwrite_Java
一、先簡(jiǎn)單首先回顧一下Service的一些問題
1、為什么使用Service?
答:對(duì)于一些需要長(zhǎng)時(shí)間才可執(zhí)行完畢的操作放在Activity里不太合適,因?yàn)锳ctivity關(guān)閉后導(dǎo)致操作不能再繼續(xù),但后臺(tái)服務(wù)可以持續(xù)運(yùn)行。
2、bindService和startService的區(qū)別?
答:1)兩者創(chuàng)建的service的生命周期不同
2)startService啟動(dòng)的服務(wù)不能返回service的實(shí)例,bindService的可以
3、為什么不直接使用new XxxxService來創(chuàng)建服務(wù)?
答:在執(zhí)行startService或者bindService時(shí),android會(huì)把會(huì)啟動(dòng)的服務(wù)進(jìn)行記錄(未做深入研究),以確保擁有后臺(tái)服務(wù)的進(jìn)程具有較高的優(yōu)先級(jí),所以要使用startService或者bindService來創(chuàng)建服務(wù)。new XxxxService只是創(chuàng)建了一個(gè)服務(wù)類的實(shí)例,而不是一個(gè)服務(wù)。
4、為什么onServiceDisconnected一直未被調(diào)用到?
答:unbindService并不會(huì)導(dǎo)致onServieDisconnected被調(diào)用,只有在服務(wù)被系統(tǒng)銷毀的時(shí)候才會(huì)被調(diào)用。
5、可以在一個(gè)應(yīng)用中使用startService跨進(jìn)程啟動(dòng)另外一個(gè)進(jìn)程的服務(wù)嗎?
答:可以,需要設(shè)置目標(biāo)進(jìn)程的包名,可以使用如下代碼或者setPackage(未測(cè)試)
Java
Intent intent = new Intent();
intent.setClassName("com.zht.car.testservice", "com.zht.car.testservice.MyTestService");
startService(intent);
1
2
3
Intentintent=newIntent();
intent.setClassName("com.zht.car.testservice","com.zht.car.testservice.MyTestService");
startService(intent);
6、既然可以跨進(jìn)程調(diào)用startService那為什么還要使用aidl?
答:startService只能啟動(dòng)另外進(jìn)程的服務(wù),最多還可以通過intent傳入一些參數(shù),但是不能從對(duì)方進(jìn)程返回?cái)?shù)據(jù),所以如果跨進(jìn)程通訊aidl還是很有必要的。
二、bindService的開發(fā)步驟簡(jiǎn)述
1、創(chuàng)建一個(gè)Service,比如本例中為MyTestService
2、在Service中定義一個(gè)Binder的子類MyServiceBinder,后面用來返回MyTestService的實(shí)例(見一、3為什么不能直接new MyTestService() )
3、定義并實(shí)例化一個(gè)MyServiceBinder對(duì)象,用來在Service的onBind函數(shù)中返回給調(diào)用者
4、在Service的onBind函數(shù)中返回MyServiceBinder實(shí)例對(duì)象,android sdk會(huì)通過各種調(diào)用將這個(gè)對(duì)象傳到ServiceConnection的onServiceConnected
5、在Activity中定義一個(gè)MyTestService對(duì)象
6、在Activity中執(zhí)行bindService
7、在Activity中實(shí)例化一個(gè)ServiceConnection對(duì)象
8、在ServiceConnection對(duì)象的onServiceConnected回調(diào)函數(shù)中,將參數(shù)中的IBinder對(duì)象強(qiáng)制轉(zhuǎn)換為Service中定義的Binder子類(MyServiceBinder)對(duì)象
9、通過強(qiáng)制Binder子類對(duì)象的方法獲取MyTestService實(shí)例,至此就得到這個(gè)Service的實(shí)例了
10、綁定狀態(tài)的控制,通過一個(gè)boolean類型的變量來控制,以及其他的回調(diào)函數(shù)的設(shè)置
三、時(shí)序圖
四、代碼
1、Service的代碼
package com.zht.car.testservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
public class MyTestService extends Service {
private MyServiceBinder mMyServiceBinder = new MyServiceBinder();
private OnWeightChangeListener mOnWeightChangeListener;
private int mWeight = 20;
public MyTestService() {
}
@Override
public IBinder onBind(Intent intent) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mWeight = mWeight * 2;
if(mOnWeightChangeListener != null){
mOnWeightChangeListener.onWeightChange(mWeight);
}
}
}, 1000);
return mMyServiceBinder;
}
class MyServiceBinder extends Binder {
MyTestService getService(){
return MyTestService.this;
}
}
public int getWeight() {
return mWeight;
}
public void setOnWeightChangeListener(OnWeightChangeListener onWeightChangeListener) {
mOnWeightChangeListener = onWeightChangeListener;
}
public interface OnWeightChangeListener {
public void onWeightChange(int weight);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
packagecom.zht.car.testservice;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Binder;
importandroid.os.Handler;
importandroid.os.IBinder;
publicclassMyTestServiceextendsService{
privateMyServiceBindermMyServiceBinder=newMyServiceBinder();
privateOnWeightChangeListenermOnWeightChangeListener;
privateintmWeight=20;
publicMyTestService(){
}
@Override
publicIBinderonBind(Intentintent){
newHandler().postDelayed(newRunnable(){
@Override
publicvoidrun(){
mWeight=mWeight *2;
if(mOnWeightChangeListener!=null){
mOnWeightChangeListener.onWeightChange(mWeight);
}
}
},1000);
returnmMyServiceBinder;
}
classMyServiceBinderextendsBinder{
MyTestServicegetService(){
returnMyTestService.this;
}
}
publicintgetWeight(){
returnmWeight;
}
publicvoidsetOnWeightChangeListener(OnWeightChangeListeneronWeightChangeListener){
mOnWeightChangeListener=onWeightChangeListener;
}
publicinterfaceOnWeightChangeListener{
publicvoidonWeightChange(intweight);
}
}
2、Activity代碼
package com.zht.car.testservice;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private MyTestService mMyTestService;
private String LOG_TAG = "MainActivity";
private boolean mServiceBinded = false;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyTestService.MyServiceBinder binder = (MyTestService.MyServiceBinder) service;
mMyTestService = binder.getService();
mMyTestService.setOnWeightChangeListener(new MyTestService.OnWeightChangeListener() {
@Override
public void onWeightChange(int weight) {
Log.d(LOG_TAG, "Weight changed: " + mMyTestService.getWeight());
}
});
mServiceBinded = true;
Log.d(LOG_TAG, "Service connected.");
Log.d(LOG_TAG, "weight: " + mMyTestService.getWeight());
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "Service disconnected.");
mServiceBinded = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onDestroy() {
if(mServiceBinded) {
unbindService(mServiceConnection);
}
super.onDestroy();
}
public void onBindServiceClick(View view) {
if(mServiceBinded){
return;
}
Intent intent = new Intent(this, MyTestService.class);
bindService(intent, mServiceConnection, Service.BIND_AUTO_CREATE);
}
public void onUnbindServiceClick(View view) {
if(!mServiceBinded) {
return;
}
unbindService(mServiceConnection);
mServiceBinded = false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
packagecom.zht.car.testservice;
importandroid.app.Service;
importandroid.content.ComponentName;
importandroid.content.Intent;
importandroid.content.ServiceConnection;
importandroid.os.IBinder;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
publicclassMainActivityextendsAppCompatActivity{
privateMyTestServicemMyTestService;
privateStringLOG_TAG="MainActivity";
privatebooleanmServiceBinded=false;
privateServiceConnectionmServiceConnection=newServiceConnection(){
@Override
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
MyTestService.MyServiceBinderbinder=(MyTestService.MyServiceBinder)service;
mMyTestService=binder.getService();
mMyTestService.setOnWeightChangeListener(newMyTestService.OnWeightChangeListener(){
@Override
publicvoidonWeightChange(intweight){
Log.d(LOG_TAG,"Weight changed: "+mMyTestService.getWeight());
}
});
mServiceBinded=true;
Log.d(LOG_TAG,"Service connected.");
Log.d(LOG_TAG,"weight: "+mMyTestService.getWeight());
}
@Override
publicvoidonServiceDisconnected(ComponentNamename){
Log.d(LOG_TAG,"Service disconnected.");
mServiceBinded=false;
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protectedvoidonDestroy(){
if(mServiceBinded){
unbindService(mServiceConnection);
}
super.onDestroy();
}
publicvoidonBindServiceClick(Viewview){
if(mServiceBinded){
return;
}
Intentintent=newIntent(this,MyTestService.class);
bindService(intent,mServiceConnection,Service.BIND_AUTO_CREATE);
}
publicvoidonUnbindServiceClick(Viewview){
if(!mServiceBinded){
return;
}
unbindService(mServiceConnection);
mServiceBinded=false;
}
}
總結(jié)
以上是生活随笔為你收集整理的java+整合handwrite_Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 列举CSS优化、提高性能的
- 下一篇: 工作383:css使absolute相对