編輯:Android編程入門
服務是一個後台運行的組件,執行長時間運行且不需要用戶交互的任務。即使應用被銷毀也依然可以工作。服務基本上包含兩種狀態 -
服務擁有生命周期方法,可以實現監控服務狀態的變化,可以在合適的階段執行工作。下面的左圖展示了當服務通過startService()被創建時的聲明周期,右圖則顯示了當服務通過bindService()被創建時的生命周期:

要創建服務,你需要創建一個繼承自Service基類或者它的已知子類的Java類。Service基類定義了不同的回調方法和多數重要方法。你不需要實現所有的回調方法。雖然如此,理解所有的方法還是非常重要的。實現這些回調能確保你的應用以用戶期望的方式實現。
下面的主服務演示了每個方法的生命周期 -
package cn.uprogrammer.androidservices;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** 標識服務如果被殺死之後的行為 */
int mStartMode;
/** 綁定的客戶端接口 */
IBinder mBinder;
/** 標識是否可以使用onRebind */
boolean mAllowRebind;
/** 當服務被創建時調用. */
@Override
public void onCreate() {
}
/** 調用startService()啟動服務時回調 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** 通過bindService()綁定到服務的客戶端 */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** 通過unbindService()解除所有客戶端綁定時調用 */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** 通過bindService()將客戶端綁定到服務時調用*/
@Override
public void onRebind(Intent intent) {
}
/** 服務不再有用且將要被銷毀時調用 */
@Override
public void onDestroy() {
}
}
這個例子將通過簡單地步驟為你展示如何創建自己的Android服務。按照下面的步驟來修改之前在Hello World實例章節中創建的Android應用程序:
下面是主活動文件src/cn.uprogrammer.androidservices/MainActivity.java文件所修改的內容。這個文件包含所有基本的生命周期方法。我們添加了startService()和stopService()方法來啟動和停止服務。
package cn.uprogrammer.androidservices;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
// Method to start the service
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
以下是src/cn.uprogrammer.androidservices/MyService.java的內容。這個文件可以基於需求實現一個或多個服務關聯的方法。對於新人,我們只實現onStartCommand()和onDestroy() -
package cn.uprogrammer.androidservices;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "服務已經啟動", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "服務已經停止", Toast.LENGTH_LONG).show();
}
}
下面將修改AndroidManifest.xml文件。這裡添加<service.../>標簽來包含我們的服務:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.uprogrammer.androidservices"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="13"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".MyService" />
</application>
</manifest>
以下是res/layout/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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android 服務實例"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="www.uprogrammer.cn"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/ic_launcher"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="啟動服務"
android:onClick="startService"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服務"
android:id="@+id/button"
android:onClick="stopService"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
下面是res/values/strings.xml的內容,來定義兩個新的常量:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Android Services</string>
<string name="title_activity_main">MainActivity</string>
<string name="menu_settings">Settings</string>
<string name="action_settings">Settings</string>
</resources>
讓我們運行剛剛修改的My Application應用程序。我假設你已經在安裝環境時創建了AVD。打開你的項目中的活動文件,點擊工具欄中的
圖標來在Android Studio中運行應用程序。Android Studio在AVD上安裝應用程序並啟動它。如果一切順利,將在模擬器窗口上顯示如下:

現在點擊"啟動服務"按鈕來啟動服務,這將執行我們編寫的onStartCommand()方法,一條"服務已經啟動"的消息在模擬器的底部出現,如下:

點擊底部的"停止服務"按鈕,可以停止服務。
Android開發學習——Android項目的目錄結構
Android項目的目錄結構: 資源文件夾:清單配置文件:Android的四大組件在使用前全部需要在清單文件中配置<?xml version
Android消息機制
每一個Android應用在啟動的時候都會創建一個線程,這個線程被稱為主線程或者UI線程,Android應用的所有操作默認都會運行在這個線程中。但是當我們想要進行數據請求,
如何開發Android Wear應用程序
Android Wear是連接安卓手機和可穿戴產品的一個平台。自從今年上半年發布以來,Android Wear獲得了大量關注,既有來自消費者的關注,也有來自開發商的關注,
安卓的主要幾大布局
今天我們的主要內容就是安卓的主要幾個基礎的布局方式。(主要布局如下:)1.線性布局(LinerLayout)2.相對布局(RelativeLayout)3.表格布局(Ta