亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android Service(不和用戶交互應用組件)案例分析

2020-04-11 12:38:58
字體:
來源:轉載
供稿:網友
Service是在一段不定的時間運行在后臺,不和用戶交互應用組件。每個Service必須在manifest中 通過<service>來聲明??梢酝ㄟ^contect.startservice和contect.bindserverice來啟動。

Service和其他的應用組件一樣,運行在進程的主線程中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現。

service的兩種模式
本地服務 Local Service 用于應用程序內部。
它可以啟動并運行,直至有人停止了它或它自己停止。在這種方式下,它以調用Context.startService()啟動,而以調用Context.stopService()結束。它可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論調用了多少次startService()方法,你只需要調用一次stopService()來停止服務。
用于實現應用程序自己的一些耗時任務,比如查詢升級信息,并不占用應用程序比如Activity所屬線程,而是單開線程后臺執行,這樣用戶體驗比較好。

遠程服務 Remote Service 用于android系統內部的應用程序之間。
它可以通過自己定義并暴露出來的接口進行程序操作。客戶端建立一個到服務對象的連接,并通過那個連接來調用服務。連接以調用Context.bindService()方法建立,以調用 Context.unbindService()關閉。多個客戶端可以綁定至同一個服務。如果服務此時還沒有加載,bindService()會先加載它。

可被其他應用程序復用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,調用已有的即可。
startService()/bindService()不是完全分離的.
生命周期
Service的生命周期并不像Activity那么復雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先后調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這里需要注意的是,如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。

startService和bindService的區別
1. 使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。
如果打算采用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。
如果調用startService()方法前服務已經被創建,多次調用startService()方法并不會導致多次創建服務,但會導致多次調用onStart()方法。
采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
2. 使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。
onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法并不會導致該方法被多次調用。
采用Context.bindService()方法啟動服務時只能調用onUnbind()方法解除調用者與服務解除,服務結束時會調用onDestroy()方法。
利用service進行音樂播放的例子
先看最終效果
 
代碼清單:
布局文件
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to my blog!"
android:textSize="16sp"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="音樂播放服務"/>
<Button
android:id="@+id/startMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="開啟音樂播放服務"/>
<Button
android:id="@+id/stopMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止音樂播放服務"/>
<Button
android:id="@+id/bindMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="綁定音樂播放服務"/>
<Button
android:id="@+id/unbindMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除 ――綁定音樂播放服務"/>
</LinearLayout>

MusicService
復制代碼 代碼如下:

package com.example.musicservice;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MusicService extends Service {
//為日志工具設置標簽
private static String TAG = "MusicService";
//定義音樂播放器變量
private MediaPlayer mPlayer;
//該服務不存在需要被創建時被調用,不管startService()還是bindService()都會啟動時調用該方法
@Override
public void onCreate() {
Toast.makeText(this, "MusicSevice onCreate()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onCreate()");
mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
//設置可以重復播放
mPlayer.setLooping(true);
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Toast.makeText(this, "MusicSevice onStart()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onStart()");
mPlayer.start();
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
Toast.makeText(this, "MusicSevice onDestroy()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onDestroy()");
mPlayer.stop();
super.onDestroy();
}
//其他對象通過bindService 方法通知該Service時該方法被調用
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "MusicSevice onBind()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onBind()");
mPlayer.start();
return null;
}
//其它對象通過unbindService方法通知該Service時該方法被調用
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(this, "MusicSevice onUnbind()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onUnbind()");
mPlayer.stop();
return super.onUnbind(intent);
}
}

MainActivy(調用service)
復制代碼 代碼如下:

package com.example.musicservice;
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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
//為日志工具設置標簽
private static String TAG = "MusicService";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//輸出Toast消息和日志記錄
Toast.makeText(this, "MusicServiceActivity",
Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity");
initlizeViews();
}
private void initlizeViews(){
Button btnStart = (Button)findViewById(R.id.startMusic);
Button btnStop = (Button)findViewById(R.id.stopMusic);
Button btnBind = (Button)findViewById(R.id.bindMusic);
Button btnUnbind = (Button)findViewById(R.id.unbindMusic);
//定義點擊監聽器
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
//顯示指定 intent所指的對象是個 service
Intent intent = new Intent(MainActivity.this,MusicService.class);
switch(v.getId()){
case R.id.startMusic:
//開始服務
startService(intent);
break;
case R.id.stopMusic:
//停止服務
stopService(intent);
break;
case R.id.bindMusic:
//綁定服務
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.unbindMusic:
//解綁服務
unbindService(conn);
break;
}
}
};
//綁定點擊監聽
btnStart.setOnClickListener(ocl);
btnStop.setOnClickListener(ocl);
btnBind.setOnClickListener(ocl);
btnUnbind.setOnClickListener(ocl);
}
//定義服務鏈接對象
final ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MainActivity.this, "MusicServiceActivity onSeviceDisconnected"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity onSeviceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MainActivity.this, "MusicServiceActivity onServiceConnected"
,Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity onServiceConnected");
}
};
}

最終效果是:
當按第一個按鈕的時候,使用startService()方法啟用服務,即使退出activity,服務還在,音樂會繼續播放。查看程序運行狀態:
 
如果是使用bindService()方法啟用服務,調用者與服務綁定在了一起,退出Activy的同時,Service也停掉了。
通過startService(),我們退出程序后,可以釋放activty的資源,由于該服務還在后臺運行著,所以我們的音樂還可以繼續播放著,。就這樣,我們就可以一邊享受音樂,一邊可以聊QQ,或者瀏覽新聞等等。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爽爽ⅴa在线观看| 欧美丝袜第一区| 在线视频欧美性高潮| 久久精品国产久精国产思思| 91成人免费观看网站| 亚洲一区二区在线| 亚洲精品有码在线| 亚洲欧美日韩在线高清直播| 国产免费一区二区三区香蕉精| 日韩人体视频一二区| 欧美亚洲成人免费| www.亚洲成人| 成人国内精品久久久久一区| 一区二区三区国产在线观看| 亚洲伦理中文字幕| 中文在线资源观看视频网站免费不卡| 97色在线观看免费视频| 日本精品性网站在线观看| 日韩精品免费观看| 最新国产精品亚洲| 欧美刺激性大交免费视频| 欧美日韩国产二区| 亚州欧美日韩中文视频| 欧美大胆a视频| 久久久久久久999精品视频| 亚洲成人黄色在线观看| 91精品久久久久久| 91人人爽人人爽人人精88v| 国产人妖伪娘一区91| 91免费精品国偷自产在线| 国产精品v日韩精品| 成人做爽爽免费视频| 日韩欧美精品免费在线| 亚洲一区二区精品| 91在线观看欧美日韩| 国产精品久久久久久久久粉嫩av| 大胆人体色综合| 亚洲天堂免费在线| 成人免费视频a| 亚洲一区久久久| 中文字幕精品一区二区精品| 欧美国产视频日韩| 国产美女高潮久久白浆| 大伊人狠狠躁夜夜躁av一区| 久久综合色88| 黄网站色欧美视频| 亚洲夜晚福利在线观看| 国产mv免费观看入口亚洲| 午夜精品免费视频| 欧美视频不卡中文| 中文字幕在线观看日韩| 人人做人人澡人人爽欧美| 成人午夜在线影院| 国产精品久久综合av爱欲tv| 日韩av影片在线观看| 久久免费福利视频| 国产色视频一区| 国产精品免费小视频| 欧美日韩国产一区中文午夜| 欧美成人手机在线| 亚洲精品久久久久久久久久久久久| 成人精品久久一区二区三区| 97香蕉超级碰碰久久免费的优势| 欧美日韩国产精品一区二区三区四区| 国产午夜精品久久久| 日韩免费在线视频| 国产精品激情av电影在线观看| 亚洲最大在线视频| 亚洲欧美国产另类| 精品亚洲一区二区| 性亚洲最疯狂xxxx高清| 日韩精品在线播放| 精品亚洲一区二区三区四区五区| 乱亲女秽乱长久久久| 欧美黑人视频一区| 91精品国产91久久久久| 国产在线精品播放| 国产成人精品久久久| 日韩在线精品视频| 97精品国产97久久久久久春色| 欧美视频二区36p| 伊人激情综合网| 日韩va亚洲va欧洲va国产| 色无极亚洲影院| 中文字幕欧美专区| 欧美激情免费视频| 性色av一区二区三区在线观看| 美女av一区二区三区| 欧美性xxxxx| 日韩在线视频观看| 国产精品日韩欧美综合| 久久久国产一区| 国产精品专区h在线观看| 国产精品黄页免费高清在线观看| 伦伦影院午夜日韩欧美限制| 色婷婷av一区二区三区在线观看| 精品视频www| 国产91色在线播放| 亚洲成人a级网| 宅男66日本亚洲欧美视频| 亚洲精品欧美极品| 97**国产露脸精品国产| 日韩精品免费在线视频| www.99久久热国产日韩欧美.com| 日韩电影中文字幕av| 日韩在线免费av| 九九热最新视频//这里只有精品| 亚洲美女又黄又爽在线观看| 青草青草久热精品视频在线观看| 久久久国产精品亚洲一区| 欧亚精品中文字幕| 久久成人免费视频| 亚洲国产成人一区| 91亚洲精品一区二区| 欧美成人在线影院| 色综合五月天导航| 成人免费福利在线| 欧美xxxx综合视频| 国产亚洲精品久久久久久777| 亚洲成**性毛茸茸| 亚洲午夜色婷婷在线| 一本色道久久综合亚洲精品小说| 欧美激情一区二区三区在线视频观看| 久久精品国产免费观看| 日韩视频亚洲视频| 久久久欧美精品| 一道本无吗dⅴd在线播放一区| 国产日产久久高清欧美一区| 国模私拍一区二区三区| 4k岛国日韩精品**专区| 在线观看日韩www视频免费| 一本色道久久综合狠狠躁篇怎么玩| 日韩av在线精品| 久久久久99精品久久久久| 欧美在线精品免播放器视频| 久久久久久久久综合| 91九色国产社区在线观看| 夜夜嗨av一区二区三区四区| 久久久精品久久久| 国产精品久久久久久久美男| www高清在线视频日韩欧美| 欧美专区在线观看| 91精品免费看| 欧美精品videos性欧美| 亚洲精品一区二区网址| 欧美福利视频在线观看| 97视频免费在线看| 欧美激情一区二区三级高清视频| 亚洲国产成人在线视频| 欧美一区二粉嫩精品国产一线天| 亚洲毛片在线免费观看| 羞羞色国产精品| 欧美在线一级va免费观看| 一区二区在线免费视频| 欧美日韩在线另类| 日韩精品视频在线观看免费| 日本一区二区在线播放| 国产精品一区二区av影院萌芽| 欧美在线观看日本一区| 97国产在线观看| 国产精品尤物福利片在线观看| 精品久久久久久国产91| 亚洲亚裔videos黑人hd| 国产精品亚洲第一区|