java+整合handwrite_Java
一、先簡單首先回顧一下Service的一些問題
1、為什么使用Service?
答:對于一些需要長時間才可執行完畢的操作放在Activity里不太合適,因為Activity關閉后導致操作不能再繼續,但后臺服務可以持續運行。
2、bindService和startService的區別?
答:1)兩者創建的service的生命周期不同
2)startService啟動的服務不能返回service的實例,bindService的可以
3、為什么不直接使用new XxxxService來創建服務?
答:在執行startService或者bindService時,android會把會啟動的服務進行記錄(未做深入研究),以確保擁有后臺服務的進程具有較高的優先級,所以要使用startService或者bindService來創建服務。new XxxxService只是創建了一個服務類的實例,而不是一個服務。
4、為什么onServiceDisconnected一直未被調用到?
答:unbindService并不會導致onServieDisconnected被調用,只有在服務被系統銷毀的時候才會被調用。
5、可以在一個應用中使用startService跨進程啟動另外一個進程的服務嗎?
答:可以,需要設置目標進程的包名,可以使用如下代碼或者setPackage(未測試)
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、既然可以跨進程調用startService那為什么還要使用aidl?
答:startService只能啟動另外進程的服務,最多還可以通過intent傳入一些參數,但是不能從對方進程返回數據,所以如果跨進程通訊aidl還是很有必要的。
二、bindService的開發步驟簡述
1、創建一個Service,比如本例中為MyTestService
2、在Service中定義一個Binder的子類MyServiceBinder,后面用來返回MyTestService的實例(見一、3為什么不能直接new MyTestService() )
3、定義并實例化一個MyServiceBinder對象,用來在Service的onBind函數中返回給調用者
4、在Service的onBind函數中返回MyServiceBinder實例對象,android sdk會通過各種調用將這個對象傳到ServiceConnection的onServiceConnected
5、在Activity中定義一個MyTestService對象
6、在Activity中執行bindService
7、在Activity中實例化一個ServiceConnection對象
8、在ServiceConnection對象的onServiceConnected回調函數中,將參數中的IBinder對象強制轉換為Service中定義的Binder子類(MyServiceBinder)對象
9、通過強制Binder子類對象的方法獲取MyTestService實例,至此就得到這個Service的實例了
10、綁定狀態的控制,通過一個boolean類型的變量來控制,以及其他的回調函數的設置
三、時序圖
四、代碼
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;
}
}
總結
以上是生活随笔為你收集整理的java+整合handwrite_Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 列举CSS优化、提高性能的
- 下一篇: 工作383:css使absolute相对