本地服務(local Service)的實現
定義;
--後臺執行、不可見、沒有介面
--優先順序高於Activity
用途:
--播放音樂、記錄地理資訊位置的改變、監聽某種動作
注意:
--執行在主執行緒,不能用來做耗時的請求活動
--可以在服務中開一個執行緒,線上程中做耗時動作
型別:
1、本地服務(local Service)
------應用程式內部
啟動方式:
-------StartService ----StopService()----stopService()-----stopSelf()------stopSelfResult()
-------BindService ----先要unbindService然後停掉(啟動源銷燬時一定要先解繫結)
2、遠端服務(Remote Service)
------Android系統內部的應用程式之間
------定義IBinder介面
生命週期:
-------StartService:---->startService()--->onCreate()--->onStartCommmand()--->ServiceRunning(呼叫停止方法)--->onDestroy()--->Service down
-------BindService: ---->bindService()--->onCreate()--->onBind()--->Service綁定了(呼叫解繫結)--->onUnbind()--->onDestroy()--->Service down
注:開啟Service沒有關閉以前onCreate()只調用一次,第二次直接開啟onStartCommmand()方法
Start方式特點:
---服務跟啟動源沒有任何聯絡
---無法得到服務物件
Bind方式特點:
---通過Ibinder介面例項,返回一個ServiceConnection物件給啟動源
---通過ServiceConnection物件的相關方法可以得到Service物件
本地服務Start啟動:直接用intent(context,class)——>startService(mintent)
補充:intent是四大元件關聯的紐帶
本地服務Bind啟動:
intent2 = new Intent(MainActivity.this, MyBindService.class);
bindService(intent2, conn, Service.BIND_AUTO_CREATE);
----參1、intent物件
----參2、ServiceConnection
----參3、讓服務建立用的 用引數:Service.BIND_AUTO_CREATE讓服務正常建立
得到Service的回傳資料:
1、binder介面:
---重寫一個類繼承Binder類
---寫一個返回當前的服務物件的方法;
2、實現繫結:
----實現一個ServiceConnection類
----重寫了兩個方法用來:連結、殺死服務
補充:有一個IntentService類,
1、它裡面包含了執行緒可以處理耗時操作
2、不能併發執行,一個執行完了才能執行寧一個;
!!!!!!!!!!!注意啊!!!!!!要在清單檔案中註冊(我經常忘記!!!!!!)
我們先來看清單檔案資訊:
<service android:name="zxx.serivce.StartService"></service>
<service android:name="zxx.serivce.BindService"></service>
再看activity的實現:
Service中的實現:package zxx.serivce; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import zxx.serivce.BindService.MyBinderService; public class MainActivity extends Activity { BindService service; ServiceConnection conn; Intent mintent2; Intent mintent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); conn = new ServiceConnection() { /** * service和啟動源接源出意外呼叫解除繫結不會 */ @Override public void onServiceDisconnected(ComponentName name) { Log.i("******","繫結意外崩潰了"); } /** * service和啟動源接源連線時呼叫。 */ @Override public void onServiceConnected(ComponentName name, IBinder ibinder) { service = ((MyBinderService) ibinder).getBindService();// 要把IBinder物件裝換成我們自定義的類 } }; } public void doClick(View v) { switch (v.getId()) { case R.id.startService: mintent = new Intent(this, StartService.class); this.startService(mintent); // Toast.makeText(this, "點選了", 0).show(); break; case R.id.BindService: mintent2 = new Intent(this, BindService.class); bindService(mintent2, conn, Service.BIND_AUTO_CREATE); break; case R.id.paly: service.paly(); break; case R.id.unbinder: unbindService(conn); break; case R.id.stop: stopService(mintent); break; default: break; } } @Override protected void onDestroy() { stopService(mintent2); unbindService(conn);// 和啟動源解綁 super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
package zxx.serivce;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class BindService extends Service {
public class MyBinderService extends Binder {
public BindService getBindService() {
return BindService.this;
}
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.i("****", ""+"BindService____onCreate()");
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinderService();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("****", ""+"BindService____onDestroy()");
}
public void paly(){
Log.i("", "音樂播放了");
}
}
StartService啟動模式的實現:
package zxx.serivce;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class StartService extends Service{
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.i("****", ""+"onCreate()");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("****", ""+"onDestroy()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("****", ""+"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.i("****", ""+"onStart");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
佈局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="zxx.serivce.MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Service啟動方式:" />
<Button
android:id="@+id/startService"
android:layout_width="288dp"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="startService" />
<Button
android:id="@+id/BindService"
android:layout_width="290dp"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="BindService" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="曹卓" />
<Button
android:id="@+id/paly"
android:layout_width="288dp"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="paly" />
<Button
android:id="@+id/unbinder"
android:layout_width="287dp"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="unbinder" />
<Button
android:id="@+id/stop"
android:layout_width="290dp"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="stop" />
</LinearLayout>