啓動服務方式1 -- startService(Intent intent)java
//結果日誌貓裏打印android
UI界面圖示例:app
//界面就2個按鈕佈局不寫了ide
一、在配置清單裏配置註冊服務佈局
代碼this
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mystartservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 註冊服務 --> <service android:name=".MyService"></service> </application> </manifest>
二、建立一個服務類繼承Servicespa
代碼日誌
/** * 啓動服務方式1 startService * 要重寫3個方法: * onCreate():建立服務 * onStartCommand():服務開始運行 該方法能夠調用屢次(在2.0之前版本中,使用onStart()回調 * 方法) * onDestroy() :服務被中止 * * @author Administrator * */ public class MyService extends Service { @Override public void onCreate() { // TODO Auto-generated method stub Log.i("data", "服務端onCreate方法"); super.onCreate(); } @Override//該方法是啓動服務第二種方式調用(bindService) public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服務端onBind方法"); return null; } @Override//啓動服務 服務開始運行(耗時而且要後臺執行的功能(例如後臺下載或音樂播放)能夠在這裏實現) public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i("data", "服務端onStartCommand方法"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("data", "服務端onDestroy方法"); } }
三、MainActivity.java類code
代碼xml
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //啓動服務的按鈕點擊事件監聽 public void startService(View view){ //使用意圖 Intent intent = new Intent(this,MyService.class); switch(view.getId()){ case R.id.bt_startService: startService(intent);//啓動服務(方式1) break; case R.id.bt_stopService: stopService(intent);//中止服務 break; } } }
當點擊第一個按鈕第一次時結果:
當點擊第一個按鈕第二次的時候:
當點擊第二個按鈕第一次的時候:
註釋:在繼續點擊第二個按鈕已經沒有反應 由於服務在點擊第依次時就調用了onDestroy方法中止了
想要服務在運行就須要在啓動服務,onDestroy方法在按真機或(模擬器)也會調用
======================================================
啓動服務方式2 -- bindService(Intent service, ServiceConnection conn, int flags)
//UI界面佈局就2個按鈕這就不寫了
界面效果圖示例:
一、在配置清單裏註冊服務
代碼
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mybindservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 註冊服務 --> <service android:name=".MyBindService"></service> </application> </manifest>
二、建立一個類(服務)繼承Service
代碼
public class MyBindService extends Service { @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Log.i("data", "服務的onCreate方法"); } @Override//返回一個IBinder對象 public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服務的onBind方法"); //一、要建立一個繼承Binder類的內部類而後new建立好的類 //二、該方法會吧new出來的對象返回到MainActivity //三、重寫ServiceConnection接口的onServiceConnected()方法 return new MyBinder(); } @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服務的onUnbind方法"); return super.onUnbind(intent); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("data", "服務的onDestroy方法"); } //在這裏實現一些耗時後臺工做 class MyBinder extends Binder{ public void getBinder(){ Log.i("data", "服務的內部類MyBinder的getBinder方法"); } } }
三、MainActivity.java類
代碼
public class MainActivity extends Activity { private MyBinder myBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { //把服務那邊onBind方法返回的IBinder對象轉換成MyBindService類裏, //建立繼承Binder類的內部類對象 //該對象能夠在MainActivity類調用MyBindService(服務)內部類的方法 //若是不這樣獲取MyBindService(服務)內部類的對象 本身在MainActivity類 //想直接聲明MyBindService(服務)內部類的對象或者new對象,是不行的(能夠本身試試) //有了MyBindService(服務)內部類的對象就能夠調用MyBindService(服務)內部類的全部方法了 myBinder = (MyBinder) service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //點擊按鈕的事件監聽 public void myService(View view){ Intent intent = new Intent(this, MyBindService.class); switch(view.getId()){ case R.id.bt_bindService://綁定服務(啓動服務) //第一個參數: Intent對象 -- 服務類 //第二個參數:重寫ServiceConnection接口聲明的對象 //第三個參數:若是沒有bind的實例 就會自動建立 bindService(intent, connection, Context.BIND_AUTO_CREATE); break; case R.id.bt_stopService//取消綁定服務 unbindService(connection); break; } } }
點擊第一個按鈕第一次時:
注意:在點擊第一個按鈕第二次時沒有再次調用onBind()方法,也就是說第二種啓動服務方式和第一種startService啓動
方式的不一樣,另外綁定服務的啓動方式是隨Activity消失而中止的不像startService啓動方式不隨Activity啓動方式消失而中止
點擊第二個按鈕第一次時:
按真機或者模擬器的退出鍵時也和取消綁定服務同樣調用onUnbind和onDestroy2個方法