編輯:關於Android編程
public class NormalService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "啟動成功", Toast.LENGTH_SHORT).show();
Log.d("NormalService", "啟動成功");
//一般在這裡啟動新線程執行耗時的操作
return super.onStartCommand(intent, flags, startId);
}
}
》在AndroidManifest.xml文件中配置該Service <service android:name="com.android.servicetest.service.NormalService" /> 》在activity中使用 private void startNormal() { nomalIntent = new Intent(); nomalIntent.setClass(this, NormalService.class); startService(nomalIntent); } 二、通過bind方式啟動Service 這種方式啟動的Sercice,訪問者與Service綁定在一起,訪問者退出,Service也就終止了 生命周期:onCreate()->onBind()->onUnbind()->onDestroy() 》定義一個繼承Service的子類
public class BinderService extends Service {
private int count;
private MyBinder mBinder;
@Override
public IBinder onBind(Intent arg0) {
if (mBinder == null) {
mBinder = new MyBinder();
}
Toast.makeText(this, "綁定成功", Toast.LENGTH_SHORT).show();
Log.d("BinderService", "綁定成功");
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
count++;
} catch (Exception e) {
}
}
}
}).start();
}
public class MyBinder extends Binder {
public int getCount() {
return count;
}
}
}
》在AndroidManifest.xml文件中配置該Service <service android:name="com.android.servicetest.service.BinderService" /> 》在activity中使用
private MyBinder mBinder;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
mBinder = (BinderService.MyBinder) binder;
}
};
private void bindService() {
bindIntent = new Intent();
bindIntent.setClass(this, BinderService.class);
bindService(bindIntent, conn, Service.BIND_AUTO_CREATE);
}
@Override protected void onDestroy() { super.onDestroy(); unbindService(conn); } Binder對象相當於Service組件的內部鉤子,關聯到綁定的Service組件; 當其他的程序組件綁定該Service時,Service會把Binder對象返回給其他程序組件,其他程序組件通過該Binder對象即可與Service組件進行實時通信。 三、IntentService,處理異步請求的服務 IntentService是Service的子類,它增加了額外的功能: 使用隊列來管理請求Intent,每當客戶端代碼通過Intent請求啟動IntentService時,IntentService會將該Intent加入隊列中,然後開啟一條新的worker線程處理隊列中的Intent,因此不會阻塞主線程。 IntentService會按次序處理隊列中的Intent,該線程保證同一時刻只處理一個Intent。 》IntentService的實現
public class IntentServiceTest extends IntentService{
public IntentServiceTest() {
super("IntentService");
}
@Override
protected void onHandleIntent(Intent arg0) {
Toast.makeText(this, "啟動成功", Toast.LENGTH_SHORT).show();
Log.d("IntentServiceTest", "啟動成功");
//該方法可以執行耗時的操作
long endTime = System.currentTimeMillis() + 20 * 1000;
while(System.currentTimeMillis() < endTime){
synchronized (this) {
try{
wait(endTime - System.currentTimeMillis());
}catch(Exception e){
}
}
}
}
}
》在AndroidManifest.xml文件中配置該Service <service android:name="com.android.servicetest.service.IntentServiceTest" /> 》在activity中使用 private void startIntentService(){ serviceIntent = new Intent(); serviceIntent.setClass(this, IntentServiceTest.class); startService(serviceIntent); } 四、跨進程調用Service(AIDL Service) Android各應用程序都運行在自己的進程中,進程之間無法直接進行數據交換,為了事項這種跨進程通信,Android提供了AIDL Service。 》創建AIDL文件,定義接口的源代碼必須以.aidl結尾 package com.android.servicetest.service; interface IMusic{ String getName(); String getYear(); } 定義好AIDL接口之後,ADT工具會自動在gen/com/android/servicetest/service/目錄生成一個IMusic接口; 在該接口裡包含一個Stub內部類,該內部類除了實現IMusic接口還實現了IBinder接口,這個Stub類將會作為遠程Service的回調類。 》定義一個Service實現類
public class MusicService extends Service{
private MusicBinder mBinder;
@Override
public IBinder onBind(Intent arg0) {
if(mBinder == null){
mBinder = new MusicBinder();
}
Toast.makeText(this, "綁定成功", Toast.LENGTH_SHORT).show();
Log.d("MusicService", "綁定成功");
return mBinder;
}
public class MusicBinder extends IMusic.Stub{
@Override
public String getName() throws RemoteException {
return "本草綱目";
}
@Override
public String getYear() throws RemoteException {
return "2006";
}
}
}
》在AndroidManifest.xml文件中配置該Service <service android:name="com.android.servicetest.service.MusicService" /> 》在activity中使用
private IMusic musicService;
private ServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
//獲取遠程Service的OnBind方法返回的對象的代理
musicService = IMusic.Stub.asInterface(binder);
}
};
private void bindAidlService(){
aidlIntent = new Intent();
aidlIntent.setClass(this, MusicService.class);
bindService(aidlIntent, connAidl, Service.BIND_AUTO_CREATE);
}
private void showContent() {
String content = "";
try {
content = musicService.getYear() + musicService.getName();
} catch (Exception e) {
}
Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
}
@Override protected void onDestroy() { super.onDestroy(); unbindService(connAidl); } 這種方式和綁定本地Service的差別很小,只是獲取Service回調的方式有區別: 綁定本地Service時可以直接獲取OnBind方法的返回值;綁定遠程Service時獲取的事OnBind方法返回的對象的代理。
Android漫游記(3)---重定位之GOT & PLT & R_ARM_JUMP_SLOT
Android系統的動態鏈接工具是/system/bin/linker(一般的Linux系統是ld.so),雖然名字不同,但是基本的動態鏈接過程是類似的。需
在Android Studio中安裝OpenCV mac環境/Linux環境
在Android Studio中安裝OpenCV對於女程序猿來說,每次安裝個什麼軟件,或者是配置個什麼環境啊,經常整得很崩潰。本程序猿阿姨也是如此~(啊,我說我是阿姨了嗎
自定義View系列教程03--onLayout源碼詳盡分析
在經過measure階段以後,系統確定了View的測量大小,接下來就進入到layout的過程。在該過程中會確定視圖的顯示位置,即子View在其父控件中的位置。嗯哼,我們直
struts2動態方法調用
本來不想寫關於struts2的學習筆記了,由於感覺關於struts2的理論知識比較簡單,所以才打算不寫,但是在學習過程中,特別是在Myeclipse中編碼練習的時候,遇到