編輯:關於Android編程
Service與Activity的區別在於:Service一直在後台運行,他沒有用戶界面,絕不會到前台來。
一,創建和配置Service
開發Service需要兩個步驟:1,繼承Service子類,2,在Manifest.xml文件中配置Service
Service中的方法:
public class FirstService extends Service { // 必須實現的方法,返回一個IBinder對象,應用程序可通過該對象與Service組件通信 @Override public IBinder onBind(Intent arg0) { return null; } // Service被創建時回調該方法。 @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); } // Service被啟動時回調該方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("Service is Started"); return START_STICKY; } // Service被關閉之前回調。 @Override public void onDestroy() { super.onDestroy(); System.out.println("Service is Destroyed"); } }Manifest.xml中配置service
二,啟動和停止Service
1,startService 啟動的服務:主要用於啟動一個服務執行後台任務,不進行通信,訪問者與Service沒有關聯,即使訪問者退出了,Service仍然運行。停止服務使用stopService
bindService 啟動的服務:該方法啟動的服務要進行通信。停止服務使用unbindService
public class StartServiceTest extends Activity { Button start, stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取程序界面中的start、stop兩個按鈕 start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); // 創建啟動Service的Intent final Intent intent = new Intent(); // 為Intent設置Action屬性 intent.setAction("org.service.FIRST_SERVICE"); start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 啟動指定Serivce startService(intent); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 停止指定Serivce stopService(intent); } }); }2,綁定本地Service並與之通信
如果訪問者和Service之間需要進行方法調用或者數據傳遞,則應該使用bindService和unbindService方法啟動關閉Service
boolean bindService(Intent service, ServiceConnection conn,int flags)方法:
service:這個參數通過Intent指定要啟動的Service
conn:ServiceConnection 對象,該對象用於監聽訪問者與Service之間的連接情況。當訪問者與Service之間連接成功時將會回調ServiceConnection對象的onServiceConnected(ComponentName name, IBinder service);當Service所在的宿主中止,導致Service與訪問者之間斷開時會回調ServiceConnection對象的onServiceDisconnected(ComponentName name)方法
flags:綁定時是否自動創建Service。0或BIND_AUTO_CREATE
ServiceConnection對象的onServiceConnected方法中有一個IBinder對象,該對象即可與被綁定Service之間的通信
通信原理:當開發Service是。該Service類必須提供一個IBinder onBind(Intent intent)方法,在綁定本地Service的情況下,onBind(Intent intent)方法所返回的IBinder對象會傳給ServiceConnection對象的onServiceConnected的(ComponentName name, IBinder service)的service參數。這樣訪問者就可使用該IBinder對象與Service進行通信了
BindService.java
public class BindService extends Service//繼承Service { private int count; private boolean quit; // 定義onBinder方法所返回的對象,此binder會傳給訪問者 private MyBinder binder = new MyBinder(); // 通過繼承Binder來實現IBinder類 public class MyBinder extends Binder //① { public int getCount() { // 獲取Service的運行狀態:count return count; } } // 必須實現的方法,綁定該Service時回調該方法 @Override public IBinder onBind(Intent intent) { System.out.println("Service is Binded"); // 返回IBinder對象 return binder; } // Service被創建時回調該方法。 @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); // 啟動一條線程、動態地修改count狀態值 new Thread() { @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { } count++; } } }.start(); } // Service被斷開連接時回調該方法 @Override public boolean onUnbind(Intent intent) { System.out.println("Service is Unbinded"); return true; } // Service被關閉之前回調該方法。 @Override public void onDestroy() { super.onDestroy(); this.quit = true; System.out.println("Service is Destroyed"); } }配置Service組件:
public class BindServiceTest extends Activity { Button bind, unbind, getServiceStatus; // 保持所啟動的Service的IBinder對象 BindService.MyBinder binder; // 定義一個ServiceConnection對象 private ServiceConnection conn = new ServiceConnection() { // 當該Activity與Service連接成功時回調該方法 @Override public void onServiceConnected(ComponentName name , IBinder service) { System.out.println("--Service Connected--"); // 獲取Service的onBind方法所返回的MyBinder對象 binder = (BindService.MyBinder) service; //① } // 當該Activity與Service斷開連接時回調該方法 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("--Service Disconnected--"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 獲取程序界面中的start、stop、getServiceStatus按鈕 bind = (Button) findViewById(R.id.bind); unbind = (Button) findViewById(R.id.unbind); getServiceStatus = (Button) findViewById(R.id.getServiceStatus); // 創建啟動Service的Intent final Intent intent = new Intent(); // 為Intent設置Action屬性 intent.setAction("org.crazyit.service.BIND_SERVICE"); bind.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 綁定指定Serivce bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); unbind.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 解除綁定Serivce unbindService(conn); } }); getServiceStatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 獲取、並顯示Service的count值 Toast.makeText(BindServiceTest.this, "Serivce的count值為:" + binder.getCount(), Toast.LENGTH_SHORT).show(); //② } }); } }
微信公眾號開發者中心提供了使用代碼開發微信微應用的功能,使用代碼開發微應用需要用到服務器,以存放編寫的代碼,因此我們需要一個服務器。那麼在微信那裡設置服務器呢?在微信公眾
實現功能:實現網絡音樂搜索功能使用觀察者設計模式使用URLEncoder.encode轉碼SearchMusicUtils是重點實現效果如圖:實現代碼如下:NetMusi
上篇給大家介紹QQ5.0側滑菜單的視頻課程,對於側滑的時的動畫效果的實現有了新的認識,似乎打通了任督二脈,目前可以實現任意效果的側滑菜單了,感謝鴻洋大大!!用的是Hori
事件分發在Android中非常重要,在滑動沖突,下拉刷新,嵌套滑動的時候都需要非常清楚事件分發的機制,才能寫好對應的處理代碼。曾經以為我對事件分發已經很清楚了,也寫過幾篇