android callRemoteService 調用其他進程的service

創建一個進程服務.程序第一次運行的時候就創建.不需要界面

要想其他進程能夠跨進程的調用本進程的方法.就得使用跨進程訪問的接口類型.隻需將接口中類和方法的修飾符去掉就行.然後把接口類編程aidl類型

服務也業務代碼:

[java] 
package com.example.remoteservice; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
/**
 * 跨進程訪問的接口類型:將接口和接口中方法的修飾類型去掉,
 * android生成aidl文件步驟:找到編寫的java源文件,將其擴展名該為aidl.然後回到項目
 * ,刷新項目,該類就會變為源文件名.aidl的文件,並且系統會自動在gen
 * .工程目錄下生成原java文件的名的java文件.可以打開看下內容與之前不一樣瞭.到此就完成瞭aidl的創建
 * 
 * @author Administrator
 * 
 */ 
public class RemoteService extends Service { 
 
    @Override 
    public IBinder onBind(Intent arg0) { 
        return new Mybinder(); 
    } 
 
    /**
     * 可以繼承系統根據自己定義的iservice接口生成iservice.adil之後的IServcice.Stub類,
     * Stub是系統自己傢上的.該類是個抽象類,繼承瞭binder類也實現瞭iservice<br>
     * 
     * @author Administrator
     * 
     */ 
    public class Mybinder extends IServcice.Stub { 
 
        @Override 
        public void callMethodInService() throws RemoteException { 
            sayHelloInService(); 
        } 
 
    } 
 
    /**
     * 服務中的方法
     */ 
    public void sayHelloInService() { 
        System.out.println("hello in service"); 
    } 
 
    @Override 
    public void onCreate() { 
        System.out.println("remote service create"); 
    } 
 

服務進程對外提供調用的接口,將該接口轉成aidl文件,
aidl文件的創建:找到編寫的java源文件,將其擴展名該為aidl.然後回到項目,刷新項目,該類就會變為源文件名.aidl的文件,並且系統會自動在gen .工程目錄下生成原java文件的名的java文件.可以打開看下內容與之前不一樣瞭.到此就完成瞭aidl的創建

[html] 
package com.example.remoteservice; 
 
interface IServcice { 
    void callMethodInService(); 

在配置文件application中註冊該服務

[html]
<service android:name=".RemoteService" > 
           <intent-filter> 
               <action android:name="com.example.remoteservice" /> <!– 指定action,可方便別的程序調用 –> 
 
           </intent-filter> 
       </service> 

到此被調用的服務就創建好瞭.如果想對外使用.必須啟動該進程.和服務.所以.為配合下面調用的例子(調用外部進程的服務)必須保證該進程的正常運行.
總結以上調用本進程中服務的方法:

 1創建一個服務,該服務中要有能被調用的方法;
 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法 ;
 3:定義一個MyBinder對象.繼承binder類,並實現IService接口,在onBind方法中返回MyBinder對象;
 4:在activity中通過bindService ()綁定一個服務;
 5:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的onServiceConnected()方法;
 6:onServiceConnected ()方法的IBinder參數就是IService類型的,強制轉換為IService;
 7:調用ISservice中方法

調用外部進程中服務(上面的進程)

訪問其他進程中服務的步驟:

 訪問外部服務.要知道對方服務的action,和可以調用服務接口的adil文件以及adil文件的包名.在本地程序創建調用服務的aidl文件的包,並添加(copy)外部服務的aidl文件,系統會自動在gen目錄下創建該adil文件接口java文件

 1創建一個服務,該服務中要有能被調用的方法;
 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法,去掉定義接口和接口中方法的修飾符,把這個接口的擴展名該為.aidl,;
 3:定義一個MyBinder對象,繼承編譯器根據IService.aidl在gen中創建的IService類中的Sutb類,
 在onBind方法中返回MyBinder對象
 4:在調用服務的工程中創建包,包名要與被調用服務工程中對應aidl文件所在的包名一樣.並復制被調用工程對應的aidl文件到本地對應aidl文件包中
 5:在activity中通過bindService ()綁定一個服務;
 6:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的方法;
 7:在實現接口中的onServiceConnected()方法調用IServcice.Stub.asInterface()方法.將onServiceConnected的IBinder參數轉換成IService類型;
 8:調用IService中的方法(調用服務中的方法),

 

按照上面步驟創建瞭同樣的包和copy瞭被調用的aidl文件之後,創建調用外部進程頁面的佈局.本例隻以一個button為例

[html] 
<Button 
    android:id="@+id/call" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="click" 
    android:text="調用外部服務" /> 

調用外部服務的代碼實現

[java]
package com.example.callremoteservice; 
 
import com.example.remoteservice.IServcice; 
 
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.os.RemoteException; 
import android.view.View; 
 
/**
 * 訪問外部服務.要知道對方服務的action,和可以調用服務接口的adil文件以及adil文件的包名<br>
 * 在本地程序創建調用服務的adil文件的包,並添加外部服務的adil文件,系統會自動在gen目錄下創建該adil文件接口java文件<br>
 * 總結:<br>
 * 訪問本進程中的service,需要用到bindService()方法.(cz23_serverlifecycle)<br>
 * 
 * 1創建一個服務,該服務中要有能被調用的方法;<br>
 * 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法 ;<br>
 * 3:定義一個MyBinder對象.繼承binder類,並實現IService接口,在onBind方法中返回MyBinder對象;<br>
 * 4:在activity中通過bindService ()綁定一個服務;<br>
 * 5:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的onServiceConnected()方法;<br>
 * 6:onServiceConnected ()方法的IBinder參數就是IService類型的,強制轉換為IService;<br>
 * 7:調用ISservice中方法<br>
 * <br>
 * 訪問 外部進程中的service,需要用到aidl(android interface definition language)(在編號24的兩個例子)<br>
 * 1創建一個服務,該服務中要有能被調用的方法;<br>
 * 2:定義一個借口IService, 接口裡面的抽象方法去調用服務中的方法,去掉定義接口和接口中方法的修飾符,把這個接口的擴展名該為.aidl,;<br>
 * 3:定義一個MyBinder對象,繼承編譯器根據IService.aidl在gen中創建的IService類中的Sutb類,
 * 在onBind方法中返回MyBinder對象<br>
 * 4:在調用服務的工程中創建包,包名要與被調用服務工程中對應aidl文件所在的包名一樣.並復制被調用工程對應的aidl文件到本地對應aidl文件包中<br>
 * 5:在activity中通過bindService ()綁定一個服務;<br>
 * 6:創建一個MyConn實現ServiceConnection接口 ,服務綁定成功後執行接口中的方法;<br>
 * 7:在實現接口中的onServiceConnected()方法調用IServcice.Stub.asInterface()方法.
 * 將onServiceConnected的IBinder參數轉換成IService類型<br>
 * 8:調用IService中的方法(調用服務中的方法),
 * 
 * @author Administrator
 * 
 */ 
public class MainActivity extends Activity { 
    private IServcice iServcice; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        Intent intent = new Intent(); 
        intent.setAction("com.example.remoteservice");// 隱式意圖,指定訪問服務的action,就是被調用服務進程值註冊服務的時候指定的action的值 
        bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);// 通過隱式意圖綁定到外部服務.參數2是服務綁定成功後的一個回調類.通過他可以獲取外部服務對外提供數據的對象 
    } 
 
    public void click(View view) { 
        try { 
            iServcice.callMethodInService(); 
        } catch (RemoteException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 
 
    class MyConn implements ServiceConnection { 
 
        @Override 
        /**
         * 參數IBinder就是綁定被調用的服務執行onBind的返回值
         */ 
        public void onServiceConnected(ComponentName arg0, IBinder service) { 
            iServcice = IServcice.Stub.asInterface(service);// 調用外部進程中service的轉換方法 
        } 
 
        @Override 
        public void onServiceDisconnected(ComponentName arg0) { 
            // TODO Auto-generated method stub 
 
        } 
 
    } 

 

 

You May Also Like