步驟: java
通常使用服務的順序爲 : android
開啓服務(onCreate-onStart)->綁定服務(onBind)->調用服務的方法()->解綁服務(onUnbind)->中止服務(onDestroy) app
這樣服務的生命週期較爲可控,
注意:
框架
<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>
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); }通常經過接口暴露方法