安卓學習筆記之service(一)
安卓四大組件之Service
今天來入門一下service這個組件,這玩意是在你后臺做一些必要的工作。
**
1.什么是service?
**
從google官網看的,官方的描述是這樣的。
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding declaration in its package’s AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
懂英語的話就一目了然了,英語水平差點的話就可以有道了。
翻譯過來就是說:
服務是應用程序組件,它表示應用程序希望執行長時間運行的操作,而不與用戶交互,或為其他應用程序提供功能。每個服務類在其包的androidmanifest.xml中都必須有相應的“聲明”。可以使用Context.startService()和context.bindservice()啟動服務。
Service是一種在后臺長期運行的。沒有界面的組件,由其它組件調用進行。
服務不太會被kill,即使在內存不足的時候被kill,當內存恢復足夠的時候,服務又會自己的復活。比如:下載的時候就可以放入服務中來做,啟動服務,完成時,關閉服務。
2.如何創建與使用service
我們要在manifest文件里進行聲明,當然我們使用as的時候我們也可以通過菜單進行快速的創建service省去手動在manifest文件添加的麻煩。會有兩種方法。
第一種
第一步:創建一個service類,并且分別重寫它的父類方法,并在manifest文件里面生命注冊
<service android:name=".MyService"/>
public class MyService extends Service {
@Override
public void onCreate() {
Log.v("dd","onCreate");
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("dd","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.v("dd","onDestroy");
super.onDestroy();
}
}
僅僅是添加了log日志打印輸出。看看生命周期的順序。然后在activity_main中添加兩個連個按鈕控件
<Button
android:id="@+id/btn_start"
android:text="Start Service"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_stop"
android:text="Stop Service"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后在activity類里面測試:
public class MyActivity extends Activity implements View.OnClickListener {
private Button btn_start;
private Button btn_stop;
private Intent intent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
intent = new Intent(this,MyService.class);
}
private void initView() {
btn_start= (Button) findViewById(R.id.btn_start);
btn_stop= (Button) findViewById(R.id.btn_stop);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_start:
startService(intent);
break;
case R.id.btn_stop:
stopService(intent);
break;
}
}
}
當點擊start按鈕的時候,會看到控制臺輸入以下的文字:
06-21 06:51:15.995 3006-3006/com.does.service V/dd: onCreate
06-21 06:51:16.001 3006-3006/com.does.service V/dd: onStartCommand
當點擊stop按鈕的時候會調用:
06-21 06:51:22.829 3006-3006/com.does.service V/dd: onDestroy
第二種
使用bindService的方法
布局文件
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StartService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StopService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_bind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BindService"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_unbind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UnBindService"
android:textAllCaps="false" />
MainActivity .java文件
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn_bind,btn_unbind;
private ServiceConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initEvent() {
connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//服務連接成功的時候操作
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//服務取消連接的時候
}
};
}
private void initView() {
btn_bind= (Button) findViewById(R.id.btn_bind);
btn_unbind= (Button) findViewById(R.id.btn_unbind);
btn_bind.setOnClickListener(this);
btn_unbind.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_start:
Intent start=new Intent(this,MyService.class);
startService(start);
break;
case R.id.btn_stop:
Intent stop=new Intent(this,MyService.class);
stopService(stop);
break;
case R.id.btn_bind:
Log.v("does","bind is clicked");
Intent bind=new Intent(this,MyService.class);
bindService(bind,connection,BIND_AUTO_CREATE);
break;
case R.id.btn_unbind:
Log.v("does","unbind is clicked");
Intent unbind=new Intent(this,MyService.class);
unbindService(connection);
break;
default:
break;
}
}
}
MyService.java
public class MyService extends Service {
@Override
public void onCreate() {
Log.v("does","onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("does","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.v("does","onDestroy");
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
當我們點擊bind按鈕的時候,發現
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: bind is clicked
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: onCreate
當我們點擊unbind的時候,發現
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: unbind is clicked
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: onDestroy
3.service的生命周期
在上面我們看到了和activity類似差不多的方法。組件都會有生命周期。所以我們介紹一下service的生命周期。
想必,這樣就很形象了吧?
第一種,
onCreate()->onStartCommand()->onDestroy()
第二種就是綁定service
onCreate()->onBind()->unBind()->onDestroy()
兩種啟動service和停止service的區別就是,第一種啟動服務時候,當應用程序退出的時候,后臺的service依舊運行,只有運行stopService的時候才停止運行service。那么bindService,整個service進程是隨著整個應用程序的生命周期存活,當app的使用內存被系統回收了,那么這個service就會跟著被回收。
智能推薦
安卓學習筆記之IntentService
什么是IntentService 它會創建一個獨立的子線程來處理所有的Intent請求,創建的子線程來處理onHandleIntent()實現的代碼,無需處理多線程的問題。默認實現onBind()方法,返回為null;默認實現onStartCommand()方法,將請求的Intent添加到隊列中。這個類實際上是繼承自service,內部是封裝了HandlerThread和Handler類。 代碼實...
安卓學習筆記
學習安卓的學習筆記,留存一下,雖然以后可能都不會從事安卓相關的工作了,紀念一下。 1 Activity 1 返回棧 活動可以層疊,啟動一個新的活動會覆蓋在原活動上,Back會銷毀最上面的活動,下面的一個活動就會重新顯示。 用任務管理一系列活動。任務用返回棧描述。 啟動一個新的活動,這個活動就在返回棧中入棧,finish()即棧頂元素出棧,系統總是會顯示處于棧頂的活動給用戶。(所以finish()銷...
安卓學習UI組件-Service
2019獨角獸企業重金招聘Python工程師標準>>> 案例: 代碼目錄 activity_main.xml MainActivity.java MyService.java MyIntentService.java MyBoundService.java 【 CatImpl.java &n...
安卓:數據存儲之SharedPreference——學習筆記
Android提供了四種數據存儲的方式 SharedPreference:一種常用的數據存儲方式,其本質是基于XML文件存儲鍵值對數據,通常用來存儲一些簡單的配置信息。 SQLite:一個輕量級數據庫,支持基本SQL語法,是Android系統中常被采用的一種數據存儲方式。 ContentProvider:Android系統中能實現應用程序之間數據共享的一種存儲方式。 文件:即常說的文件存儲方法,常...
安卓學習筆記——URI
一、URI:統一資源定位符,Universal Resource Identifier的簡稱 每一個ContentProvider都擁有一個公共的URI,這個URI用于表示ContentProvider提供的數據 二、URI的組成: 例: 三、URI 常用方法: 1、static Uri parse(String UriString):將一個字符串轉換為Uri 例如: 2、 List getPat...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...