1. 程式人生 > >本地服務(local Service)的實現

本地服務(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的實現:
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);
	}
}
Service中的實現:
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>