Android 服務組件 調用其內部方法

步驟: java

通常使用服務的順序爲 : android

開啓服務(onCreate-onStart)->綁定服務(onBind)->調用服務的方法()->解綁服務(onUnbind)->中止服務(onDestroy) app

這樣服務的生命週期較爲可控,
注意:
框架

  1. 解綁操做只可執行一次,爲保證調用者退出時解綁,配合activity onDestory使用(見代碼)
  2. 若是服務綁定過,直接stopService停不掉,必須先解綁
  3. 若是服務沒有經過startService開啓過,則解綁服務會調用onDestory()

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    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=".MainActivity" 
    android:orientation="vertical"
    >

    <Button
        android:onClick="start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="開啓服務" />

    <Button
        android:onClick="stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="中止服務" />

    <Button
        android:onClick="changeSingName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="調用服務中的方法" />

     <Button
        android:onClick="bind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bind服務" />
      <Button
        android:onClick="unbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UnBind服務" />
</LinearLayout>



MAIN AC:
package com.example.service;


import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity
{
	private final String TAG="ChungeService";
	
	//步驟4、獲得Binder對象引用
	private IService binder;
	private MyConn conn;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@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;
	}

	/**
	 * 開啓服務
	 * 
	 * @param v
	 */
	public void start(View v)
	{
		Intent intent = new Intent(this, ChungeService.class);
		// 服務對象 被系統框架實例化的(new)
		startService(intent);
	}

	/**
	 * 中止服務
	 * 
	 * @param v
	 */
	public void stop(View v)
	{
		Intent intent = new Intent(this, ChungeService.class);
		stopService(intent);
	}

	/**
	 * 換歌 調用service中的方法
	 * 
	 * @param v
	 */
	public void changeSingName(View v)
	{
		// 此方法不可行 沒有android的上下文
		// ChungeService chungeService=new ChungeService();
		// chungeService.changeSing("name");
		
		//利用bindService()能夠間接獲得服務的代理人
		
		//步驟五、利用Binder對象間接調用服務裏的方法
		binder.callChangeName("月亮之上");
	}
	
	/**
	 * 綁定服務
	 * @param v
	 */
	public void bind(View v)
	{
		start(v);
		Intent intent = new Intent(this, ChungeService.class);
		//conn 代理人對象 不可爲空
		//flags 選項
		//步驟1.綁定服務方式開啓服務
		conn=new MyConn();
		bindService(intent, conn, BIND_AUTO_CREATE);
	}
	
	private class MyConn implements ServiceConnection
	{

		@Override
		public void onServiceConnected(ComponentName name, IBinder service)
		{
			//步驟三、服務返回的Binder對象傳遞回來
			binder=(IService)service;
			Log.i(TAG, "代理人返回……");
		}

		//只有程序異常終止纔會調用
		@Override
		public void onServiceDisconnected(ComponentName name)
		{
		}
		
	}
	/**
	 * 解除綁定服務
	 * @param v
	 */
	public void unbind(View v)
	{
		unbindService(conn);
	}
	
	/**
	 * 此操做保證退出程序時服務解綁
	 */
	@Override
	protected void onDestroy()
	{
		try
		{
			//服務只能夠解綁一次 因此用try catch
			unbind(null);
		} catch (Exception e)
		{
		}
		super.onDestroy();
	}
}



ChungeService: ide

package com.example.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ChungeService extends Service
{

	private final String TAG="ChungeService";

	@Override
	public boolean onUnbind(Intent intent)
	{
		Log.i(TAG, "onUnbind 解除綁定……");
		return super.onUnbind(intent);
	}
	@Override
	public IBinder onBind(Intent arg0)
	{
		//步驟2.返回自定義的Binder對象
		Log.i(TAG, "onBind 服務被成功綁定……");
		return new MyBinder();
	}

	private class MyBinder extends Binder implements IService	
	{
		public void callChangeName(String name)
		{
			changeSing(name);
		}
	}
	
	@Override
	public void onCreate()
	{
		super.onCreate();
		Log.i(TAG, "onCreate 服務開始,開始唱歌……");
	}
	
	@Override
	public void onDestroy()
	{
		super.onDestroy();
		Log.i(TAG, "onDestroy 服務中止,中止唱歌……");
	}
	
	//更改歌曲名字
	public void changeSing(String name)
	{
		Toast.makeText(getApplicationContext(), "changeSing 開始唱"+name+"……", Toast.LENGTH_SHORT).show();
	}
}



IService: this

package com.example.service;

public interface IService
{
	public void callChangeName(String name);
}
通常經過接口暴露方法
相關文章
相關標籤/搜索