編輯:關於Android編程
我們在開發過程中可能會使用Service後台服務,而後台服務可能需要與Activity之間進行數據交互。
這時我們可以假設Activity為客戶端程序,而服務Service為服務端。
以下是信使(Messenger)對象的使用概要:
1. 服務端實現的一個處理器(Handler接口),這個處理器針對每次來自客戶端的調用接收一次回調;
2、 客戶端實現的一個處理器(Handler接口),這個處理器針對每次客戶端向服務端發送消息
2. 這個處理器被用於創建一個信使對象(Messager)(這個信使對象要引用這個處理器);
3. 信使對象創建一個創建一個服務端從onBind()方法中返回給客戶端的IBinder對象;
4. 客戶端使用這個IBinder對象來實例化這個信使對象(信使引用了服務端的處理器),客戶端使用這個信使給服務端發送Message對象;
5. 服務端在它的處理器(Handler)的handleMessage()方法中依次接收每個Message對象
客戶端程序:
package com.example.testservice;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
Messenger mService = null;
private Button button;
private int index=1;
//將Handler與Messenger綁定
final Messenger mMessenger = new Messenger(new IncomingHandler());
private ServiceConnection connection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
}
/*
* 當服務端與客戶端綁定成功後會調用此方法 service為服務端傳遞過來的Messenger對象(non-Javadoc)
* 綁定成功後需要將客戶端的Handler接口通過Messenger發送到服務端
* 以便服務端向客戶端發消息
*/
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message message = Message.obtain();
message.what=index;
message.replyTo = mMessenger;
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
Intent intent = new Intent(this, MyService.class);
//綁定Service
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
public void onClick(View v) {
Message message = Message.obtain();
message.what=index;
try {
/*
* 向服務端發消息,
*
*/
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
//此Handler接口主要處理來自服務端的發送消息
class IncomingHandler extends Handler{
public void handleMessage(Message msg) {
}
}
}
服務端程序
package com.example.testservice;
import java.util.ArrayList;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
/*
* 客戶端的Messenger集合
* 之所以為集合,是因為一個服務端可能對應多個客戶端
*/
ArrayList
/**
* 服務端Messenger信使
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
public void onCreate() {
super.onCreate();
}
public void onDestroy() {
super.onDestroy();
}
/*
* 接收來自客戶端的消息
*/
class IncomingHandler extends Handler {
public void handleMessage(Message msg) {
Log.e("handleMessage", "handleMessage");
switch (msg.what) {
case 1:
Log.e("11111111111", "11111111111");
mClients.add(msg.replyTo);
break;
case 2:
break;
}
}
}
/*
* (non-Javadoc)
* @see android.app.Service#onBind(android.content.Intent)
* 將服務端的Messeager返回給客戶端
*/
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
android系統cpu資源相關查詢 我們都知道android是基於linux系統內核的,在linux系統中我們查看系統資源消耗情況,一個可以直接通過命令行的
Action Bar是app應用頂部的一個方形區域,不一定總會顯示(如全屏Theme時),它屬於窗口的一部分,有點類似於windows的窗口的標題
一、前言好久沒更新博客了,最近一直在忙,找實習,整理畢業資料,找房子等等。現在大部分基本忙完了,這幾天在公司寫的一些自定義控件,打算發出來與大家分享。 首先看看
轉載請注明出處,謝謝~~目錄本文概述 動畫補充說明 屬性動畫的View加載方式 TypeEvaluator的使用 TimeInterpolator LayoutTrans