Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android servicelifecycle 服務的生命周期和程序內部調用服務

android servicelifecycle 服務的生命周期和程序內部調用服務

編輯:關於Android編程

創建服務類:創建MyService類繼承Service,其中內部類IServiceImpl繼承系統的binder類 和實現自定義接口IService

IService提供外部調用的方法:

[java] 
package com.example.serverlifecycle; 
 
public interface IService { 
    public void callMethodInService(); 

系統的binder類實現了IBinder接口.在創建的服務類重寫父類的onBind方法中返回實現了binder類和繼承iservice的類的一個對象.在實現了binder的類中重寫IService接口中的方法,調用在實現了service的類中的方法.這樣就能達到調用綁定服務的方法.可以獲取服務中的數據.只有綁定的服務才能獲取服務數據
service業務類:
[java]
package com.example.serverlifecycle; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 
 
/**
 * 服務的開啟方法<br>
 * 1:開啟方法startService(intent)/stopService(intent)<br>
 * 2:綁定服務bindService(intent, conn, Context.BIND_AUTO_CREATE)/unbindService(conn)
 * 區別:開啟服務,服務一旦開啟,與調用者沒有任何關系,調用者的activity即使是退出了.也不會影響後台service的運行,
 * 在activity裡不能使用服務的方法<br>
 * 綁定服務,通過綁定開啟的服務,服務跟調用者不求同生但求同死,如果調用者的activity退出了(或者在當前的activity點擊返回按鈕),
 * 那它綁定的服務也回跟著退出,綁定方式開啟的服務,是可以在activity中調用服務的方法<br>
 * 
 * @author Administrator
 * 
 */ 
public class MyService extends Service { 
 
    @Override 
    /**
     * 綁定時調用的方法,如果服務不存在,就執行onCreate方法創建服務,然後執行onBind方法綁定服務,之後再執行onBind方法就沒效果了
     */ 
    public IBinder onBind(Intent intent) { 
        // IBinder 繼承了Binder 
        System.out.println("onBind"); 
        return new IServiceImpl();// 返回自定義的繼承了binfer類(等於也實現了IBinder)和實現了IService類的一個對象 
    } 
 
    /**
     * 服務裡面的方法
     */ 
    public void sayHelloInService() { 
        System.out.println("hello service"); 
    } 
 
    /**
     * Binder實現了IBinder接口,IServiceImpl有繼承了Binder,等於是IServiceImpl也實現了IBinder方法
     * IService 自己定義的接口
     * 
     * @author Administrator
     * 
     */ 
    public class IServiceImpl extends Binder implements IService { 
 
        @Override 
        public void callMethodInService() { 
            sayHelloInService(); 
        } 
 
    } 
 
    @Override 
    /**
     * 解除綁定調用的方法,調用了onUnbind方法後會跟著調用onDestroy方法,解除服務之後結束服務<br>
     * 綁定的服務職能解除一次,如果多次解除服務,程序會有異常
     */ 
    public boolean onUnbind(Intent intent) { 
        // TODO Auto-generated method stub 
        System.out.println("onUnbind"); 
        return super.onUnbind(intent); 
    } 
 
    @Override 
    /**
     * 只有在第一次啟動服務或者調用了onDestroy之後再中心開啟服務才會調用onCreate
     */ 
    public void onCreate() { 
        super.onCreate(); 
        System.out.println("onCreate"); 
    } 
 
    @Override 
    /**
     * 停止一個服務
     */ 
    public void onDestroy() { 
        super.onDestroy(); 
        System.out.println("onDestroy"); 
    } 
 
    @Override 
    /**
     * 開始一個服務
     */ 
    public void onStart(Intent intent, int startId) { 
        super.onStart(intent, startId); 
        System.out.println("onStart"); 
    } 

在配置文件中的application標簽中注冊上面的服務類
[html] 
<service android:name="MyService" /> 
創建布局文件:

[html]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <Button 
        android:id="@+id/start" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="啟動服務" /> 
 
    <Button 
        android:id="@+id/end" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="停止服務" /> 
 
    <Button 
        android:id="@+id/startBindService" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="綁定服務" /> 
 
    <Button 
        android:id="@+id/endBindService" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="解除綁定" /> 
 
    <Button 
        android:id="@+id/callMethod" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="調用服務裡的方法" /> 
 
</LinearLayout> 
界面業務代碼:
[java]
package com.example.serverlifecycle; 
 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class MainActivity extends Activity implements OnClickListener { 
    private Button startButton;// 普通開啟服務按鈕 
    private Button endButton; 
    private Intent intent; 
    private Button startBindButton;// 綁定服務 
    private Button endBindButton;// 解除服務 
    private Button callMethodInService;// 解除服務 
    private MyServiceConnection conn; 
    private IService iService; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        startButton = (Button) findViewById(R.id.start); 
        endButton = (Button) findViewById(R.id.end); 
        startButton.setOnClickListener(this); 
        endButton.setOnClickListener(this); 
        intent = new Intent(this, MyService.class); 
        startBindButton = (Button) findViewById(R.id.startBindService); 
        endBindButton = (Button) findViewById(R.id.endBindService); 
        startBindButton.setOnClickListener(this); 
        endBindButton.setOnClickListener(this); 
        callMethodInService = (Button) findViewById(R.id.callMethod); 
        callMethodInService.setOnClickListener(this); 
        conn = new MyServiceConnection(); 
    } 
 
    @Override 
    public void onClick(View v) { 
        switch (v.getId()) { 
        case R.id.start: 
            startService(intent);// 啟動服務 
            break; 
        case R.id.end: 
            stopService(intent);// 停止服務 
            break; 
        case R.id.startBindService:// 綁定服務 
            bindService(intent, conn, Context.BIND_AUTO_CREATE);// 綁定服務,參數3如果這個綁定的服務不存在的時候,綁定的時候就會創建出這個服務 
            break; 
        case R.id.endBindService: 
            unbindService(conn);// 解除綁定服務 
            break; 
        case R.id.callMethod: 
            iService.callMethodInService(); 
            break; 
        } 
 
    } 
 
    @Override 
    protected void onDestroy() { 
        unbindService(conn);// 在activity結束的時候,調用unbindService(conn)可避免出現serviceconnectionleaked異常 
        super.onDestroy(); 
    } 
 
    class MyServiceConnection implements ServiceConnection { 
 
        @Override 
        /**
         * 綁定某個服務成功後執行的方法,就是在綁定的服務執行了onCreate方法之後
         * service,該對象是由綁定服務的onBind方法的返回值,因為onBind()返回值實現IService接口,所以可以強制轉換為IService接口類型
         */ 
        public void onServiceConnected(ComponentName arg0, IBinder service) { 
            iService = (IService) service; 
        } 
 
        @Override 
        public void onServiceDisconnected(ComponentName arg0) { 
 
        } 
 
    } 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved