編輯:Android開發實例
Android SDK 提供了兩種類型的 Service ,用於類似 *nix 守護進程或者 windows 的服務
1. 本地服務 Local Service :用於應用程序內部
2. 遠程服務 Remote Service :用於 android 系統內部的應用程序之間
前者用於實現應用程序自己的一些耗時任務,比如查詢升級信息,並不占用應用程式比如 Activity 所屬線程,而是單開線程後台執行,這樣用戶體驗比較好。
後者可被其他應用程序服用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,調用已有的即可。
不需要和 Activitye 交互的本地服務
本地服務編寫比較簡單。首先,要創建一個 Service 類,該類繼承 android 的 Service 類。然後在 Activity 中的 onCreate 和 onDestory 中分別執行以下語句開啟服務和停止服務。
this .startService( new Intent( this , ServiceImpl. class ));
this .stopService( new Intent( this , ServiceImpl. class ));
需要和 Activity 交互的遠程服務
上面的示例是通過 startService 和 stopService 啟動關閉服務的。適用於服務和 activity 之間沒有調用交互的情況。如果之間需要傳遞參數或者方法調用。需要使用 bind 和 unbind 方法。
具體做法是,服務類需要增加接口,比如 ServiceInterface ,另外,服務類需要有一個內部類,這樣可以方便訪問外部類的封裝數據,這個內部類需要繼承 Binder 類並實現 ServiceInterface 接口。還有,就是要實現 Service 的 onBind 方法,不能只傳回一個 null 了。
在 android 的 musicplayer 源碼中 MediaPlaybackService 使用了以上的服務方式,針對該源碼進行分析:
首先需要了解進程間通信、需要 AIDL (以及 Binder )
關於 AIDL 的介紹在文檔: docs/guide/developing/tools/aidl.html
關於 IBinder 的介紹在文檔: docs/reference/android/os/IBinder.html
以及 Binder : docs/reference/android/os/Binder.html
manifest 中 Service 的語法,見 docs/guide/topics/manifest /service-element.html
以上轉自 http://blog.csdn.net/saintswordsman/archive/2010/01/05/5130947.aspx
步驟一:建立 aidl 文件
通過 aidl.exe 會在 gen 中生成該 service 類,該類中的成員變量 stub 實現了以下功能:
extends Binder implements ServiceInterface,源碼如下
- interface IMediaPlaybackService
- {
- void openfile(String path);
- void openfileAsync(String path);
- void open(in int [] list, int position);
- ...................//接口方法
- }
- public interface IMediaPlaybackService extends android.os.IInterface {
- /**生成binder類 */
- public static abstract class Stub extends android.os.Binder implements
- com.android.mymusic.IMediaPlaybackService {
- private static final java.lang.String DESCRIPTOR = "com.android.mymusic.IMediaPlaybackService";
- /** Construct the stub at attach it to the interface. */
- public Stub() {
- this.attachInterface(this, DESCRIPTOR);
- }
- ...................
- ...................
- ...................//binder 方法
- }
- public void openfile(java.lang.String path)
- throws android.os.RemoteException;
- ...................
- ...................//接口方法
- ...................
- }
步驟二:編寫服務的實現類 MediaPlaybackService
- public class MediaPlaybackService extends Service {
- ......
- @Override
- public IBinder onBind(Intent intent) {
- mDelayedStopHandler.removeCallbacksAndMessages(null);
- mServiceInUse = true;
- return mBinder;
- }
- private final IMediaPlaybackService.Stub mBinder = new IMediaPlaybackService.Stub()
- {
- ...................//實現接口方法
- };
- }
步驟三:編寫一個消費這個服務的 Activity : MediaPlaybackActivity: (除此之外還有其他類)
- public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
- View.OnTouchListener, View.OnLongClickListener
- {
- private IMediaPlaybackService mService = null;
- @Override
- public void onStart() {
- super.onStart();
- ...................//其他代碼
- if (false == MusicUtils.bindToService(this, serviecConnection)) {
- // something went wrong
- ...................//其他代碼
- }
- private ServiceConnection serviecConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName classname, IBinder obj) {
- mService = IMediaPlaybackService.Stub.asInterface(obj);
- if (MusicUtils.sService == null) {
- MusicUtils.sService = mService;
- ...................//其他代碼
- }
- }
- public void onServiceDisconnected(ComponentName classname) {
- }
- };
- }
- //MusicUtils類:定義了播放器所需要的操作以及service和Activity之間的相互作用的操作
- public class MusicUtils {
- ...................//其他代碼
- public static boolean bindToService(Context context, ServiceConnection callback) {
- context.startService(new Intent(context, MediaPlaybackService.class));
- ServiceBinder sb = new ServiceBinder(callback);
- sConnectionMap.put(context, sb);
- return context.bindService((new Intent()).setClass(context,
- MediaPlaybackService.class), sb, 0);
- }
- ...................//其他代碼
- }
需要注意:
遠程服務往往不只是傳遞 java 基本數據類型。這時需要注意 android 的一些限制和規定:
以下轉自 http://yangguangfu.javaeye.com/blog/699306
1. android 支持 String 和 CharSequence
2. 如果需要在 aidl 中使用其他 aidl 接口類型,需要 import ,即使是在相同包結構下;
3. android 允許傳遞實現 Parcelable 接口的類,需要 import ;
4. android 支持集合接口類型 List 和 Map ,但是有一些限制,元素必須是基本型或者上述三種情況,不需要 import 集合接口類,但是需要對元素涉及到的類型 import ;
非基本數據類型,也不是 String 和 CharSequence 類型的,需要有方向指示,包括 in 、 out 和 inout , in 表示由客戶端設置, out 表示由服務端設置, inout 是兩者均可設置。
項目需求: TextView顯示一段文字,格式為:白雪公主(姓名,字數不確定)向您發來了2(消息
Android提供了很多控件便於開發者進行UI相關的程序設計。但是很多時候,默認的一些UI設置不足以滿足我們的需求,要麼不好看,要麼高度不夠,亦或者是與應用界面不
這幾天因為項目需求,需要在ImageView上面疊加一層透明圓弧,並且在沿著圓弧的方向顯示相應的文字,效果如下圖所示: 拿到這個需求,首先想到的是自定義
以前在線性代數中學習了矩陣,對矩陣的基本運算有一些了解,前段時間在使用GDI+的時候再次學習如何使用矩陣來變化圖像,看了之後在這裡總結說明。首先大家看看下面這個3