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

詳解Android中Service服務(wù)的基礎(chǔ)知識及編寫方法

 更新時間:2016年04月11日 14:19:06   作者:chenzheng_java  
這篇文章主要介紹了詳解Android中Service服務(wù)的基礎(chǔ)知識及編寫方法,包括Service的啟動流程及生命周期等基本內(nèi)容,需要的朋友可以參考下

首先,讓我們確認下什么是service?

        service就是android系統(tǒng)中的服務(wù),它有這么幾個特點:它無法與用戶直接進行交互、它必須由用戶或者其他程序顯式的啟動、它的優(yōu)先級比較高,它比處于前臺的應(yīng)用優(yōu)先級低,但是比后臺的其他應(yīng)用優(yōu)先級高,這就決定了當(dāng)系統(tǒng)因為缺少內(nèi)存而銷毀某些沒被利用的資源時,它被銷毀的概率很小哦。

那么,什么時候,我們需要使用service呢?
        我們知道,service是運行在后臺的應(yīng)用,對于用戶來說失去了被關(guān)注的焦點。這就跟我們打開了音樂播放之后,便想去看看圖片,這時候我們還不想音樂停止,這里就會用到service;又例如,我們打開了一個下載鏈接之后,我們肯定不想瞪著眼睛等他下載完再去做別的事情,對吧?這時候如果我們想手機一邊在后臺下載,一邊可以讓我去看看新聞啥的,就要用到service。

service分類:
       一般我們認為service分為兩類,本地service和遠程service。

      1. 本地service:顧名思義,那就是和當(dāng)前應(yīng)用在同一個進程中的service,彼此之間擁有共同的內(nèi)存區(qū)域,所以對于某些數(shù)據(jù)的共享特別的方便和簡單;

      2. 遠程service:主要牽扯到不同進程間的service訪問。因為android的系統(tǒng)安全的原因?qū)е铝宋覀冊诓煌倪M程間無法使用一般的方式共享數(shù)據(jù)。在這里android為我們提供了一個AIDL工具。(android interface description language)android接口描述語言。在后邊我們將會對其進行詳細的介紹。

Service啟動流程
context.startService() 啟動流程:
context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop

如果Service還沒有運行,則android先調(diào)用onCreate(),然后調(diào)用onStart();
如果Service已經(jīng)運行,則只調(diào)用onStart(),所以一個Service的onStart方法可能會重復(fù)調(diào)用多次。
如果stopService的時候會直接onDestroy,如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運行,該Service的調(diào)用者再啟動起來后可以通過stopService關(guān)閉Service。
所以調(diào)用startService的生命周期為:onCreate --> onStart (可多次調(diào)用) --> onDestroy

context.bindService()啟動流程:
context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
 
onBind()將返回給客戶端一個IBind接口實例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到Service的實例、運行狀態(tài)或其他操作。這個時候把調(diào)用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調(diào)用onUnbind->onDestroy相應(yīng)退出。
所以調(diào)用bindService的生命周期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。
在Service每一次的開啟關(guān)閉過程中,只有onStart可被多次調(diào)用(通過多次startService調(diào)用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調(diào)用一次。

2016411141501384.gif (558×544)

service生命周期:

     和Activity相比,service的生命周期已經(jīng)簡單的不能再簡單了,只有onCreate()->onStart()->onDestroy()三個方法。

Activity中和service有關(guān)的方法:

  • startService(Intent intent):啟動一個service
  • stopService(Intent intent) :停止一個service


如果我們想使用service中的一些數(shù)據(jù)或者訪問其中的一些方法,那么我們就要通過下面的方法:

  • public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;
  • public void unbindService(ServiceConnection conn);

intent是跳轉(zhuǎn)到service的intent,如 Intent intent = new Intent(); intent.setClass(this,MyService.class);

/** 
  * 鏈接到service時觸發(fā)。 
  * name 鏈接到service組件的名稱 
  * service 在service中調(diào)用onBund時返回的IBinder,主要用來進行信息的交流 
  */ 
 @Override 
 public void onServiceConnected(ComponentName name, IBinder service) { 
  Log.i("通知", "鏈接成功!"); 
  MyBinder binder = (MyBinder)service; 
  MyService myService = binder.getMyService(); 
  int count = myService.getCount(); 
  Log.i("通知", "count="+count); 
   
 } 

   
使用service的步驟:


第一步:我們要繼承service類,實現(xiàn)自己的service。

如果想要訪問service中的某些值,我們通常會提供一個繼承了Binder的內(nèi)部類,通過onBund()方法返回給service請求。這里實際上巧妙的利用了內(nèi)部類能夠訪問外部類屬性的特點。        

第二步:在androidManifest.xml中進行注冊,如:

<!-- 
 service配置開始
 -->
 <service android:name="MyService"></service>
<!-- 
 service配置結(jié)束
 -->

第三步:在activity中進行啟動、綁定、解綁或者停止service。

(很多書上說,service與用戶是不能交互的,其實這話很不正確,我們完全可以通過activity與service進行交互嘛!我覺得,確切的說法應(yīng)該是service與用戶不能進行直接的交互)。

例子
下邊提供一個調(diào)用service聽音樂的例子:


activity代碼:

package cn.com.chenzheng_java; 
 
import cn.com.chenzheng_java.MyService.MyBinder; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
/** 
 * @description 對service進行簡單的應(yīng)用 
 */ 
public class ServiceActivity extends Activity implements OnClickListener{ 
 private Button button_start ; 
 private Button button_bind ; 
 private Button button_destroy ; 
 private Button button_unbind; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.service); 
   
  button_start = (Button) findViewById(R.id.button1_service); 
  button_bind = (Button) findViewById(R.id.button2_service); 
  button_destroy = (Button) findViewById(R.id.button3_service); 
  button_unbind = (Button) findViewById(R.id.button4_service); 
   
  button_start.setOnClickListener(this); 
  button_bind.setOnClickListener(this); 
  button_destroy.setOnClickListener(this); 
  button_unbind.setOnClickListener(this); 
   
 } 
 
 private class MyServiceConnection implements ServiceConnection{ 
 
  /** 
   * 鏈接到service時觸發(fā)。 
   * name 鏈接到service組件的名稱 
   * service 在service中調(diào)用onBund時返回的IBinder,主要用來進行信息的交流 
   */ 
  @Override 
  public void onServiceConnected(ComponentName name, IBinder service) { 
   Log.i("通知", "鏈接成功!"); 
   MyBinder binder = (MyBinder)service; 
   MyService myService = binder.getMyService(); 
   int count = myService.getCount(); 
   Log.i("通知", "count="+count); 
    
  } 
 
  @Override 
  public void onServiceDisconnected(ComponentName name) { 
   Log.i("通知", "鏈接未成功!"); 
  } 
   
 } 
  
 private MyServiceConnection serviceConnection = new MyServiceConnection(); 
 @Override 
 public void onClick(View v) { 
  if(v == button_start){ 
   Intent intent = new Intent(); 
   intent.setClass(getApplicationContext(), MyService.class); 
   startService(intent); 
  } 
   
  if(v == button_bind){ 
   Intent intent = new Intent(); 
   intent.setClass(getApplicationContext(), MyService.class); 
   bindService(intent,serviceConnection , BIND_AUTO_CREATE); 
  } 
  if(v==button_destroy){ 
   Intent intent = new Intent(); 
   intent.setClass(getApplicationContext(), MyService.class); 
   stopService(intent); 
  } 
  if(v==button_unbind){ 
   unbindService(serviceConnection); 
  }   
   
 } 
  
} 

繼承service的類:

package cn.com.chenzheng_java; 
 
import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.Binder; 
import android.os.IBinder; 
import android.util.Log; 
 
/** 
 * @description 實現(xiàn)自己的service 
 * @author chenzheng_java 
 * @since 2011/03/18 
 */ 
public class MyService extends Service { 
 MediaPlayer mediaPlayer; 
 
 /** 
  * 當(dāng)用戶調(diào)用bindService方法時會觸發(fā)該方法 返回一個IBinder對象,我們可以通過該對象,對service中 的某些數(shù)據(jù)進行訪問 
  */ 
 @Override 
 public IBinder onBind(Intent intent) { 
  Log.i("通知", "service綁定成功!"); 
  return new MyBinder(); 
 } 
 
 @Override 
 public void onCreate() { 
  Log.i("通知", "service創(chuàng)建成功!"); 
 
  mediaPlayer = MediaPlayer.create(this, R.raw.aiweier); 
  mediaPlayer.setLooping(false); 
  super.onCreate(); 
 } 
 
 @Override 
 public void onDestroy() { 
  mediaPlayer.stop(); 
  Log.i("通知", "service銷毀成功!"); 
  super.onDestroy(); 
 } 
 
 @Override 
 public void onRebind(Intent intent) { 
  Log.i("通知", "service重新綁定成功!"); 
  super.onRebind(intent); 
 } 
 
 @Override 
 public void onStart(Intent intent, int startId) { 
  mediaPlayer.start(); 
  Log.i("通知", "service start成功!"); 
  super.onStart(intent, startId); 
 } 
 
 @Override 
 public boolean onUnbind(Intent intent) { 
  mediaPlayer.stop(); 
  Log.i("通知", "service解綁成功!"); 
  return super.onUnbind(intent); 
 } 
 
 private int count = 100; 
 
 public int getCount() { 
  return count; 
 } 
 
 public void setCount(int count) { 
  this.count = count; 
 } 
 
 public class MyBinder extends Binder { 
  /** 
   * @return 返回一個個人的service對象 
   */ 
  MyService getMyService() { 
   return MyService.this; 
  } 
 } 
 
} 

service.xml代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent"> 
 <Button android:text="啟動" android:id="@+id/button1_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
 <Button android:text="綁定" android:id="@+id/button2_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
 <Button android:text="銷毀" android:id="@+id/button3_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
 <Button android:text="解綁" android:id="@+id/button4_service" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
</LinearLayout> 

androidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="cn.com.chenzheng_java" 
  android:versionCode="1" 
  android:versionName="1.0"> 
 <uses-sdk android:minSdkVersion="8" /> 
 
 <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  <activity android:name="ServiceActivity" 
     android:label="@string/app_name"> 
   <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
   </intent-filter> 
  </activity> 
<!-- 
 service配置開始 
 --> 
 <service android:name="MyService"></service> 
<!-- 
 service配置結(jié)束 
 --> 
 </application> 
 </manifest> 

  
最終效果圖:

2016411141629351.gif (348×195)

相關(guān)文章

  • Android控件FlowLikeView實現(xiàn)點贊動畫

    Android控件FlowLikeView實現(xiàn)點贊動畫

    這篇文章主要為大家詳細介紹了一個點贊動畫的優(yōu)雅控件FlowLikeView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Listview加載的性能優(yōu)化是如何實現(xiàn)的

    Listview加載的性能優(yōu)化是如何實現(xiàn)的

    在android開發(fā)中Listview是一個很重要的組件,它以列表的形式根據(jù)數(shù)據(jù)的長自適應(yīng)展示具體內(nèi)容,用戶可以自由的定義listview每一列的布局,接下來通過本文給大家介紹Listview加載的性能優(yōu)化是如何實現(xiàn)的,對listview性能優(yōu)化相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • AndroidGUI27中findViewById返回null的快速解決辦法

    AndroidGUI27中findViewById返回null的快速解決辦法

    這篇文章主要介紹了AndroidGUI27中findViewById返回null的快速解決辦法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Android實現(xiàn)斷點續(xù)傳功能

    Android實現(xiàn)斷點續(xù)傳功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)斷點續(xù)傳功能,能在上次的斷點處繼續(xù)上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Android使用AIDL實現(xiàn)兩個App間通信

    Android使用AIDL實現(xiàn)兩個App間通信

    這篇文章主要為大家詳細介紹了Android使用AIDL實現(xiàn)兩個App間通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android編程實現(xiàn)Toast自定義布局簡單示例

    Android編程實現(xiàn)Toast自定義布局簡單示例

    這篇文章主要介紹了Android編程實現(xiàn)Toast自定義布局的方法,結(jié)合簡單實例形式分析了Toast自定義布局的實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • 完美解決Android Studio集成crashlytics后無法編譯的問題

    完美解決Android Studio集成crashlytics后無法編譯的問題

    下面小編就為大家?guī)硪黄昝澜鉀QAndroid Studio集成crashlytics后無法編譯的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Android下如何使用百度地圖sdk

    Android下如何使用百度地圖sdk

    百度地圖 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系統(tǒng))及以上版本設(shè)備的應(yīng)用程序接口
    2013-07-07
  • Android Animation實戰(zhàn)之一個APP的ListView的動畫效果

    Android Animation實戰(zhàn)之一個APP的ListView的動畫效果

    這篇文章主要介紹了Android Animation實戰(zhàn)項目,為大家分享了一個APP的ListView的動畫效果,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android 7.0應(yīng)用之間如何共享文件

    Android 7.0應(yīng)用之間如何共享文件

    這篇文章主要介紹了Android 7.0應(yīng)用之間如何共享文件,幫助大家更好的理解和使用Android進行開發(fā),感興趣的朋友可以了解下
    2020-12-12

最新評論

大冶市| 德清县| 河北区| 玉树县| 喀什市| 青阳县| 乡城县| 突泉县| 九寨沟县| 方山县| 衡南县| 广安市| 香港| 崇文区| 中牟县| 巫溪县| 右玉县| 周宁县| 瑞安市| 弋阳县| 中方县| 高清| 蒙阴县| 丽江市| 陆丰市| 岚皋县| 卢龙县| 张北县| 高雄县| 双鸭山市| 南昌市| 清河县| 怀化市| 湖北省| 唐山市| 泰安市| 方山县| 无棣县| 绩溪县| 加查县| 蒙城县|