最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android 進程間通信的幾種實現(xiàn)方式

 更新時間:2017年01月01日 11:35:41   作者:Gjson  
在Android SDK中提供了4種用于跨進程通訊的方式。這篇文章主要介紹了詳解Android 進程間通信的幾種實現(xiàn)方式,有興趣的可以了解一下。

一、概述

由于應用程序之間不能共享內存。在不同應用程序之間交互數(shù)據(jù)(跨進程通訊),在Android SDK中提供了4種用于跨進程通訊的方式。

這4種方式正好對應于android系統(tǒng)中4種應用程序組件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨進程調用其他應用程序的Activity;Content Provider可以跨進程訪問其他應用程序中的數(shù)據(jù)(以Cursor對象形式返回),當然,也可以對其他應用程序的數(shù)據(jù)進行增、刪、改操 作;Broadcast可以向android系統(tǒng)中所有應用程序發(fā)送廣播,而需要跨進程通訊的應用程序可以監(jiān)聽這些廣播;Service和Content Provider類似,也可以訪問其他應用程序中的數(shù)據(jù),但不同的是,Content Provider返回的是Cursor對象,而Service返回的是Java對象,這種可以跨進程通訊的服務叫AIDL服務。

 Activity

Activity的跨進程訪問與進程內訪問略有不同。雖然它們都需要Intent對象,但跨進程訪問并不需要指定Context對象和Activity的 Class對象,而需要指定的是要訪問的Activity所對應的Action(一個字符串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個參數(shù)指定)。

在android系統(tǒng)中有很多應用程序提供了可以跨進程訪問的Activity,例如,下面的代碼可以直接調用撥打電話的Activity。

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678" ); 
startActivity(callIntent);

Content Provider 

Android應用程序可以使用文件或SqlLite數(shù)據(jù)庫來存儲數(shù)據(jù)。Content Provider提供了一種在多個應用程序之間數(shù)據(jù)共享的方式(跨進程共享數(shù)據(jù))。應用程序可以利用Content Provider完成下面的工作

1. 查詢數(shù)據(jù)

2. 修改數(shù)據(jù)

3. 添加數(shù)據(jù)

4. 刪除數(shù)據(jù)

雖然Content Provider也可以在同一個應用程序中被訪問,但這么做并沒有什么意義。Content Provider存在的目的向其他應用程序共享數(shù)據(jù)和允許其他應用程序對數(shù)據(jù)進行增、刪、改操作。

Android系統(tǒng)本身提供了很多Content Provider,例如,音頻、視頻、聯(lián)系人信息等等。我們可以通過這些Content Provider獲得相關信息的列表。這些列表數(shù)據(jù)將以Cursor對象返回。因此,從Content Provider返回的數(shù)據(jù)是二維表的形式。

廣播(Broadcast) 

廣播是一種被動跨進程通訊的方式。當某個程序向系統(tǒng)發(fā)送廣播時,其他的應用程序只能被動地接收廣播數(shù)據(jù)。這就象電臺進行廣播一樣,聽眾只能被動地收聽,而不能主動與電臺進行溝通。
在應用程序中發(fā)送廣播比較簡單。只需要調用sendBroadcast方法即可。該方法需要一個Intent對象。通過Intent對象可以發(fā)送需要廣播的數(shù)據(jù)。

Service

1.利用AIDL Service實現(xiàn)跨進程通信

這是我個人比較推崇的方式,因為它相比Broadcast而言,雖然實現(xiàn)上稍微麻煩了一點,但是它的優(yōu)勢就是不會像廣播那樣在手機中的廣播較多時會有明顯的時延,甚至有廣播發(fā)送不成功的情況出現(xiàn)。

注意普通的Service并不能實現(xiàn)跨進程操作,實際上普通的Service和它所在的應用處于同一個進程中,而且它也不會專門開一條新的線程,因此如果在普通的Service中實現(xiàn)在耗時的任務,需要新開線程。

要實現(xiàn)跨進程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨進程服務其實是采用C/S的架構,因而AIDL的目的就是實現(xiàn)通信接口。

首先舉一個簡單的栗子。

服務端代碼如下:

 首先是aidl的代碼:

package com.android.service; 
 
interface IData 
{ 
  int getRoomNum(); 
} 

RoomService的代碼如下:

package com.android.service; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
public class RoomService extends Service{ 
 
  private IData.Stub mBinder=new IData.Stub() { 
     
    @Override 
    public int getRoomNum() throws RemoteException { 
       return 3008; 
    } 
  }; 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    return mBinder; 
  } 
 
} 

AndroidManifest如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.android.aidlsampleservice" 
  android:versionCode="1" 
  android:versionName="1.0" > 
 
  <uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
 
  <application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"    
    <service android:name="com.android.service.RoomService"> 
      <intent-filter> 
        <action android:name="com.aidl.service.room"/> 
      </intent-filter> 
    </service> 
  </application> 
 
</manifest> 

然后運行該Service所在的Project即可。

客戶端代碼如下:

注意客戶端也要有aidl文件,所以最簡單的辦法就是將Service端中aidl所在的包直接復制過去。另外要注意的是在onDestroy中要解除和Service的綁定。

MainActivity.java的代碼如下:

package com.example.aidlsampleclient; 
 
import com.android.service.IData; 
 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
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.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
   
  private static final String TAG="MainActivity"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private Button bindServiceButton; 
  private Button getServiceButton; 
   
   
  IData mData; 
   
  private ServiceConnection conn=new ServiceConnection() 
  { 
 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     
      Log.i(TAG,"----------------onServiceConnected--------"); 
      mData=IData.Stub.asInterface(service); 
    } 
 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     
      Log.i(TAG,"----------------onServiceDisconnected-------------"); 
      mData=null; 
       
    } 
     
  }; 
   
  private void initView() 
  { 
    bindServiceButton=(Button)findViewById(R.id.bindServiceButton); 
    getServiceButton=(Button)findViewById(R.id.getServiceButton); 
    bindServiceButton.setOnClickListener(this); 
    getServiceButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
   switch(v.getId()) 
    { 
    case R.id.bindServiceButton: 
      bindService(); 
      break; 
    case R.id.getServiceButton: 
      getService();   
       break; 
    default: 
       break; 
    } 
  } 
   
   
  private void bindService() 
  { 
    Intent intent=new Intent(); 
    intent.setAction(ROOM_SERVICE_ACTION); 
    bindService(intent,conn,BIND_AUTO_CREATE); 
  } 
   
  private void getService() 
  { 
    try 
    { 
      if(mData!=null) 
      { 
        int roomNum=mData.getRoomNum(); 
        showLongToast("RoomNum:"+roomNum); 
      } 
       
    } 
    catch(RemoteException ex) 
    { 
      ex.printStackTrace(); 
    } 
     
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
    unbindService(conn); 
  } 
} 

activity_main.xml的代碼如下:

<RelativeLayout 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" > 
 
  <Button  
    android:id="@+id/bindServiceButton" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="BindService" 
    /> 
  <Button 
    android:id="@+id/getServiceButton" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="GetService" 
    android:layout_below="@id/bindServiceButton" 
    />   
</RelativeLayout> 

運行結果如下:

bubuko.com,布布扣

然后舉一個稍微復雜一點的栗子,注意如果*.aidl文件中含有自定義的對象,那么該對象的類要實現(xiàn)Parcelable接口,并且要新建一個該類的aidl文件,否則會出現(xiàn)could not find import for class com.android.service.XX的錯誤,其中XX為類名。還是上面的栗子,但是aidl文件中添加了一些新的方法。仍以上面的RoomService為例,

Service端的代碼如下:

Room類的代碼為:

package com.android.service; 
 
import android.os.Parcel; 
import android.os.Parcelable; 
 
public class Room implements Parcelable{ 
 
  //房間號 
  private int roomNum; 
  //房間大小 
  private float roomSpace; 
  //是否有空調 
  private boolean hasAirConditioner; 
  //是否有Wifi 
  private boolean hasWifi; 
  //房間內的裝飾風格 
  private String decorativeStyle; 
   
  public static final Parcelable.Creator<Room>CREATOR=new Parcelable.Creator<Room>() { 
 
    @Override 
    public Room createFromParcel(Parcel source) { 
      return new Room(source); 
    } 
 
    @Override 
    public Room[] newArray(int size) { 
      return null; 
    } 
     
  }; 
   
  public Room(int roomNum,float roomSpace,boolean hasAirConditioner,boolean hasWifi,String decorativeStyle) 
  { 
    this.roomNum=roomNum; 
    this.roomSpace=roomSpace; 
    this.hasAirConditioner=hasAirConditioner; 
    this.hasWifi=hasWifi; 
    this.decorativeStyle=decorativeStyle; 
  } 
   
  private Room(Parcel source) 
  { 
    roomNum=source.readInt(); 
    roomSpace=source.readFloat(); 
    boolean[]tempArray=new boolean[2]; 
    source.readBooleanArray(tempArray); 
    hasAirConditioner=tempArray[0]; 
    hasWifi=tempArray[1]; 
    decorativeStyle=source.readString();  
  } 
   
  @Override 
  public String toString() 
  { 
    StringBuilder sb=new StringBuilder(); 
    sb.append("Basic info of room is as follows:\n"); 
    sb.append("RoomNum:"+roomNum+"\n"); 
    sb.append("RoomSpace:"+roomSpace+"\n"); 
    sb.append("HasAirConditioner:"+hasAirConditioner+"\n"); 
    sb.append("HasWifi:"+hasWifi+"\n"); 
    sb.append("Decorative Style:"+decorativeStyle); 
    return sb.toString(); 
     
  } 
   
  @Override 
  public int describeContents() { 
    return 0; 
  } 
 
  @Override 
  public void writeToParcel(Parcel dest,int flags) { 
    dest.writeInt(roomNum); 
    dest.writeFloat(roomSpace); 
    dest.writeBooleanArray(new boolean[]{hasAirConditioner,hasWifi}); 
    dest.writeString(decorativeStyle);    
  } 
 
} 

Room的聲明為:

package com.android.service; 
parcelable Room; 

IRoom.aidl的代碼為:

package com.android.service; 
import com.android.service.Room; 
 
interface IRoom 
{ 
 Room getRoom(); 
} 

RoomService的代碼為:

package com.android.service; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
public class RoomService extends Service{ 
 
  private IRoom.Stub mBinder=new IRoom.Stub() { 
     
    @Override 
    public Room getRoom() throws RemoteException { 
      Room room=new Room(3008,23.5f,true,true,"IKEA"); 
      return room;     
    } 
  }; 
   
  @Override 
  public IBinder onBind(Intent intent) { 
    return mBinder; 
  } 
 
} 

由于AndroidManifest.xml的代碼不變,因而此處不再貼出。下面是客戶端的代碼:

package com.example.aidlsampleclient; 
import com.android.service.IRoom; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
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.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
   
  private static final String TAG="MainActivity"; 
  //private static final String SERVICE_ACTION="com.aidl.service.data"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private Button bindServiceButton; 
  private Button getServiceButton; 
   
   
  IRoom mRoom; 
   
  private ServiceConnection conn=new ServiceConnection() 
  { 
 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     
      Log.i(TAG,"----------------onServiceConnected--------"); 
      showLongToast("onServiceConnected"); 
      mRoom=IRoom.Stub.asInterface(service); 
    } 
 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     
      Log.i(TAG,"----------------onServiceDisconnected-------------"); 
      mRoom=null; 
       
    } 
     
  }; 
   
  private void initView() 
  { 
    bindServiceButton=(Button)findViewById(R.id.bindServiceButton); 
    getServiceButton=(Button)findViewById(R.id.getServiceButton); 
    bindServiceButton.setOnClickListener(this); 
    getServiceButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
    switch(v.getId()) 
    { 
    case R.id.bindServiceButton: 
      bindService(); 
      break; 
    case R.id.getServiceButton: 
      getService();   
       break; 
    default: 
       break; 
    } 
  } 
   
   
  private void bindService() 
  { 
    Intent intent=new Intent(); 
    intent.setAction(ROOM_SERVICE_ACTION); 
    bindService(intent,conn,BIND_AUTO_CREATE); 
  } 
   
  private void getService() 
  { 
    if(mRoom!=null) 
    { 
      try 
      { 
        showLongToast(mRoom.getRoom().toString()); 
      } 
      catch (RemoteException e)  
      { 
        e.printStackTrace(); 
      } 
    } 
 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
    resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
    unbindService(conn); 
  } 
} 

注意首先仍然是要將Room,IRoom的代碼復制過去,否則會出錯。

運行結果如下:

bubuko.com,布布扣

顯然,客戶端已經成功讀取到服務信息。

注意,上面的所舉的栗子其實不只是跨進程,還是跨應用。要注意的是,跨應用一定跨進程,但是跨進程不一定是跨應用。對于跨應用的情況,利用AIDL基本上是較好的解決了問題,但也只是“較好”而已,實際上并不完美,比如,如果要增加一個服務,如果利用AIDL的話,那么又要改寫aidl文件,如果是涉及自定義對象,則還要增加自定義對象的聲明,而且這種改變不只是Service端的改變,客戶端也要跟著改變,顯然這種解決方案不夠優(yōu)雅。

那么,有沒有更優(yōu)雅的方法呢?

當然有,那就是利用Service的onStartCommand(Intent intent, int flags, int startId)方法。

服務端代碼如下:

package com.android.service; 
 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
import android.widget.Toast; 
 
public class RoomService extends Service{ 
 
  private static final String TAG="RoomService"; 
  private static final int CLEAN_SERVICE=0x1; 
  private static final int ORDER_SERVICE=0x2; 
  private static final int PACKAGE_SERVICE=0x3; 
  private static final String SERVICE_KEY="ServiceName";  
  @Override 
  public void onStart(Intent intent, int startId) { 
    showLog("onStart"); 
  } 
 
  @Override 
  public int onStartCommand(Intent intent, int flags, int startId) { 
    //String action=intent.getAction(); 
    Log.i(TAG,"onStartCommand"); 
     
    int actionFlag=intent.getIntExtra(SERVICE_KEY, -1); 
   switch(actionFlag) 
    { 
    case CLEAN_SERVICE: 
      showShortToast("Start Clean Service Right Now"); 
      break; 
    case ORDER_SERVICE: 
      showShortToast("Start Order Service Right Now"); 
      break; 
    case PACKAGE_SERVICE: 
      showShortToast("Start Package Service Right Now"); 
      break; 
    default: 
      break; 
    } 
    return super.onStartCommand(intent, flags, startId); 
  } 
 
  private void showLog(String info) 
  { 
    Log.i(TAG,info); 
  } 
   
  private void showShortToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT).show(); 
  } 
  @Override 
  public void onDestroy() { 
    showLog("onDestroy"); 
    super.onDestroy(); 
  } 
 
  @Override 
  public void onCreate() { 
    showLog("onCreate"); 
    super.onCreate(); 
  } 
 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    showLog("onBind"); 
    return null; 
  } 
 
  @Override 
  public boolean onUnbind(Intent intent) { 
    showLog("onUnbind"); 
    return super.onUnbind(intent); 
  } 
   
} 

客戶端代碼如下:

package com.example.aidlsampleclient; 
import com.android.service.IRoom; 
import com.android.service.RoomService; 
 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
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.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
  private static final String TAG="MainActivity"; 
  private static final String ROOM_SERVICE_ACTION="com.aidl.service.room"; 
   
  private static final int CLEAN_SERVICE=0x1; 
  private static final int ORDER_SERVICE=0x2; 
  private static final int PACKAGE_SERVICE=0x3; 
   
  private static final String SERVICE_KEY="ServiceName"; 
   
  private Button cleanButton; 
  private Button orderButton; 
  private Button packageButton; 
   
  private void initView() 
  { 
    cleanButton=(Button)findViewById(R.id.cleanButton); 
    orderButton=(Button)findViewById(R.id.orderButton); 
    packageButton=(Button)findViewById(R.id.packageButton); 
   
    cleanButton.setOnClickListener(this); 
    orderButton.setOnClickListener(this); 
    packageButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
  switch(v.getId()) 
    { 
    case R.id.cleanButton: 
      cleanAction(); 
      break; 
    case R.id.orderButton: 
      orderAction(); 
      break; 
    case R.id.packageButton: 
      packageAction(); 
      break; 
    default: 
       break; 
    } 
  } 
     
  private void cleanAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,CLEAN_SERVICE); 
  } 
   
  private void orderAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,ORDER_SERVICE); 
  } 
   
  private void packageAction() 
  { 
    startAction(ROOM_SERVICE_ACTION,PACKAGE_SERVICE); 
  } 
   
  private void startAction(String actionName,int serviceFlag) 
  { 
    //Intent intent=new Intent(this,RoomService.class); 
    Intent intent=new Intent(); 
    intent.setAction(actionName); 
    intent.putExtra(SERVICE_KEY, serviceFlag); 
    this.startService(intent); 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
   resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
  } 
} 

運行結果如下:

bubuko.com,布布扣

顯然,此時客戶端順利獲取了服務。

上面舉的是跨應用的例子,如果是在同一個應用的不同進程的話,則有更簡單的實現(xiàn)方法。

RoomService的代碼如下:

package com.android.service; 
 
import com.android.actions.Actions; 
 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 
import android.widget.Toast; 
 
public class RoomService extends Service{ 
 
  private static final String TAG="RoomService"; 
  @Override 
  public void onStart(Intent intent, int startId) { 
    showLog("onStart"); 
  } 
 
  @Override 
  public int onStartCommand(Intent intent, int flags, int startId) { 
    //String action=intent.getAction(); 
    Log.i(TAG,"onStartCommand"); 
    String action=intent.getAction(); 
    if(Actions.CLEAN_ACTION.equals(action)) 
    {   
      showShortToast("Start Clean Service Right Now"); 
    } 
    else if(Actions.ORDER_ACTION.equals(action)) 
    { 
      showShortToast("Start Order Service Right Now"); 
    } 
    else if(Actions.PACKAGE_ACTION.equals(action)) 
    { 
      showShortToast("Start Package Service Right Now"); 
    } 
    else 
    { 
      showShortToast("Wrong action"); 
    } 
    return super.onStartCommand(intent, flags, startId); 
  } 
 
  private void showLog(String info) 
  { 
    Log.i(TAG,info); 
  } 
   
  private void showShortToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT).show(); 
  } 
  @Override 
  public void onDestroy() { 
    showLog("onDestroy"); 
    super.onDestroy(); 
  } 
 
  @Override 
  public void onCreate() { 

    showLog("onCreate"); 
    super.onCreate(); 
  } 
 
 
  @Override 
  public IBinder onBind(Intent intent) { 
    showLog("onBind"); 
    return null; 
  } 
 
  @Override 
  public boolean onUnbind(Intent intent) { 
    showLog("onUnbind"); 
    return super.onUnbind(intent); 
  } 
   
}

MainActivity的代碼如下:

package com.android.activity; 
import com.android.activity.R; 
import com.android.service.RoomService; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.Toast; 
import android.view.View; 
import com.android.actions.Actions; 
 
public class MainActivity extends Activity implements View.OnClickListener{ 
 
  private static final String TAG="MainActivity"; 
 
  private static final String SERVICE_KEY="ServiceName"; 
   
  private Button cleanButton; 
  private Button orderButton; 
  private Button packageButton; 
   
  private void initView() 
  { 
    cleanButton=(Button)findViewById(R.id.cleanButton); 
    orderButton=(Button)findViewById(R.id.orderButton); 
    packageButton=(Button)findViewById(R.id.packageButton); 
   
    cleanButton.setOnClickListener(this); 
    orderButton.setOnClickListener(this); 
    packageButton.setOnClickListener(this); 
  } 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
   
  @Override 
  public void onClick(View v) { 
   switch(v.getId()) 
    { 
    case R.id.cleanButton: 
      cleanAction(); 
      break; 
    case R.id.orderButton: 
      orderAction(); 
      break; 
    case R.id.packageButton: 
      packageAction(); 
      break; 
    default: 
       break; 
    } 
  } 
     
  private void cleanAction() 
  { 
    startAction(Actions.CLEAN_ACTION); 
  } 
   
  private void orderAction() 
  { 
    startAction(Actions.ORDER_ACTION); 
  } 
   
  private void packageAction() 
  { 
    startAction(Actions.PACKAGE_ACTION); 
  } 
   
  private void startAction(String actionName) 
  { 
    Intent intent=new Intent(this,RoomService.class); 
    intent.setAction(actionName); 
    this.startService(intent); 
  } 
   
  private void showLongToast(String info) 
  { 
    Toast.makeText(getBaseContext(), info, Toast.LENGTH_LONG).show(); 
  } 
 
  @Override 
  public boolean onCreateOptionsMenu(Menu menu) { 
   resent. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
  } 
  @Override 
  protected void onDestroy() { 
    super.onDestroy(); 
  } 
} 

從打印的log可看出,客戶端每調用一次Context.startService(Intent),Service就會重新執(zhí)行一次onStartCommand---->onStart;但是使用AIDL的話,綁定服務之后,不會重復執(zhí)行onStart,顯然后者的代價更小。

Service:前臺Service,像我們經常用的天氣、音樂其實都利用了前臺Service來實現(xiàn)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android仿QQ微信未讀消息小紅點BadgeHelper

    Android仿QQ微信未讀消息小紅點BadgeHelper

    這篇文章主要介紹了Android仿QQ微信未讀消息小紅點的實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Android 源碼如何編譯調試

    Android 源碼如何編譯調試

    本文主要介紹Android 源碼編譯調試,這里對Android 源碼的編譯以及調試做了詳細的流程詳解,有需要的小伙伴可以參考下
    2016-08-08
  • Android升級支持庫版本遇到的兩個問題詳解

    Android升級支持庫版本遇到的兩個問題詳解

    安卓平臺其中一個很牛逼的地方在于它支持各種不同的設備。從你的平板電腦,到你的手機,電視等,安卓無處不在。這篇文章主要給大家介紹了關于Android升級支持庫版本遇到的兩個問題,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • Android使用JobScheduler定期推送本地通知實例代碼

    Android使用JobScheduler定期推送本地通知實例代碼

    本篇文章主要介紹了Android使用JobScheduler定期推送本地通知實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android開發(fā)之XML文件解析的使用

    Android開發(fā)之XML文件解析的使用

    本篇文章介紹了,Android開發(fā)之XML文件解析的使用。需要的朋友參考下
    2013-04-04
  • android中多線程下載實例

    android中多線程下載實例

    本文以實例的方式為大家介紹下android中的多線程下載附源碼,感興趣的朋友可以學習下哈
    2013-06-06
  • android通過bitmap生成新圖片關鍵性代碼

    android通過bitmap生成新圖片關鍵性代碼

    android通過bitmap生成新圖片具體實現(xiàn)如下,感興趣的朋友可以參考下哈,希望對你有所幫助
    2013-06-06
  • Android中@id和@+id及@android:id的區(qū)別介紹

    Android中@id和@+id及@android:id的區(qū)別介紹

    這篇文章主要給大家介紹了關于Android中@id和@+id及@android:id的區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Android中卡頓優(yōu)化布局詳細介紹

    Android中卡頓優(yōu)化布局詳細介紹

    大家好,本篇文章主要講的是Android中卡頓優(yōu)化布局詳細介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Android電池電量監(jiān)聽的示例代碼

    Android電池電量監(jiān)聽的示例代碼

    本篇文章主要介紹了Android電池電量監(jiān)聽的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

什邡市| 泸溪县| 琼结县| 来凤县| 五寨县| 佳木斯市| 和硕县| 商水县| 淳化县| 嫩江县| 抚顺县| 剑阁县| 潼关县| 北宁市| 鄂温| 武陟县| 清涧县| 搜索| 神池县| 敦化市| 公安县| 葵青区| 高清| 北辰区| 阳朔县| 乐业县| 武定县| 中卫市| 柳林县| 镇江市| 宽城| 苍梧县| 吕梁市| 大邑县| 阜宁县| 云龙县| 蚌埠市| 光山县| 台中县| 华亭县| 县级市|