細談編程語言建立的後臺服務---my note

  就拿c#編程語言來講吧: java


用c#中建立一個windows服務很是簡單,與windows服務相關的類都在System.ServiceProcess命名空間下。 mysql

每一個服務都須要繼承自ServiceBase類,並重寫相應的啓動、暫停、中止等方法。 android

windows服務的相關信息是存放與註冊表中的,因此他能夠在不須要用戶登陸的狀況下自動運行,在c#中你不須要再直接向註冊表中添加信息了,c#提供了服務安裝類 ServiceProcessInstaller和ServiceInstaller來實現服務的安裝。 web

首先,用vs建立一個windows服務項目 sql


Program中只包含服務運行的相關信息 apache

代碼以下:

/// <summary>
/// 應用程序的主入口點。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()//這裏是一個數組,意味着咱們能夠在一個服務進程中建立多個服務實例,只須要在這裏加上便可
};
ServiceBase.Run(ServicesToRun);
}

Service1.cs就是咱們須要的服務類,與windows服務相關的基本操做大均可以在這裏找到,如:Start,Stop,Pause,Continue等,咱們要作的就是根據這些操做作不一樣的處理就能夠了。 編程

咱們先在服務Start和Stop時分別記錄一條信息到D盤 c#

代碼以下:

protected override void OnStart(string[] args)
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服務啓動"));
}
protected override void OnStop()
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服務中止"));
}

一個簡單的服務就完成了,下一步添加安裝信息

雙擊項目中的Service.cs轉到服務設計界面,在空白處右鍵選擇「添加安裝程序」 windows


vs會自動建立一個默認名稱爲ProjectInstaller.cs的文件並轉到相應的設計界面 數組

默認添加兩個類 serviceProcessInstaller1和serviceInstaller1,第一個主要用來設置服務所屬帳戶,關係到服務的運行,第二個是服務信息描述,如:服務名、是否自動啓動等

右鍵serviceProcessInstaller1屬性,將Account屬性選擇爲LocalSystem

因爲windows服務不能經過雙擊直接運行,因此咱們須要藉助.net提供的InstallUtil.exe來安裝服務。

打開windows服務管理器就能看到咱們安裝的服務,默認服務安裝成功後不會馬上啓動,須要咱們手動啓動。

android建立後臺服務


Android中使用IntentService建立Android系統後臺服務

IntentService提供了在單個後臺線程運行操做的簡單結構。這容許它操做耗時操做,而不影響UI響應。一樣,IntentService也不影響UI生命週期事件,因此,它在某些可能關閉AsyncTask的狀況下,仍會繼續運行(實測在Activity的onDestory裏寫AsyncTask沒法運行)。

IntentService有以下限制:

1.它不能直接影響UI。要把結果反映給UI,須要發給Activity
2.工做請求會順序運行。若是一個操做未結束,後面發送的操做必須等它結束(單線程)
3.IntentService裏運行的操做沒法被中斷

然而,在大多數狀況下,IntentService是簡單後臺任務的首選方式。

本節展現瞭如何建立IntentService的子類,如何建立onHandleIntent()回調,如何在AndroidManifest.xml聲明IntentService。

建立IntentService

定義一個IntentService的子類,覆蓋onHandleIntent()方法:

代碼以下:

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

提示:其餘Service正常的回調,像 onStartCommand()在IntentService裏會自動調用。在IntentService裏,應該避免覆蓋這些回調。

在AndroidManifest.xml裏定義IntentService

IntentService也是Service),須要在AndroidManifest.xml裏註冊。

代碼以下:

<application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    <application/>

android:name屬性指定了IntentService的類名。

note:<service>節點不能包含intent filter。發送工做請求的Activity使用明確的Intent,會指定哪一個IntentService。這也意味着,只有同一個app裏的組件,或者另外一個有相同user id的應用才能訪問IntentService。

如今你有了基礎的IntentService類,能夠用Intent對象發送工做請求。

建立發送工做請求傳給IntentService

建立一個明確的Intent,添加須要的數據,調用startService()發送給IntentService

代碼以下:
/*
 * Creates a new Intent to start the RSSPullService
 * IntentService. Passes a URI in the
 * Intent's "data" field.
 */
mServiceIntent = new Intent(getActivity(), RSSPullService.class);
mServiceIntent.setData(Uri.parse(dataUrl));
//Call startService() 
// Starts the IntentService
getActivity().startService(mServiceIntent);

提示:能夠在Activity or Fragment的任意位置發送工做請求。若是你須要先取到用戶輸入,你能夠在點擊事件或相似手勢的回調方法裏發送工做請求。

一旦調用了startService(),IntentService會在onHandleIntent()工做,OK。

Java編程語言建立Windows後臺案例:

打開myeclipse,打開敲代碼。
  windows服務是一個運行在操做系統後臺的可執行程序(打開方式:win+r -> services.msc),咱們平常用到的apache、mysql、tomcat等的啓動和關閉都會封裝成一個windows服務,隨着計算機啓動而啓動,藏匿在後臺,不影響用戶的其它工做。 
  今天先分享一個入門級的java建立windows服務的例子。 
   
  1.打包成win服務的功能代碼LogService.java 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
public class Logservice { 
public static void main(String args[]){ 
Calendar cal = Calendar.getInstance(); 
String s =  "f:\\"+new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime())+".txt"; 
System.out.println(s); 
File f = new File(s); 
try { 
FileOutputStream out = new FileOutputStream(f); 
} catch (FileNotFoundException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 





運行後在f:路徑下建立一個日期記事本。 
   2.下載JavaService (http://javaservice.objectweb.org/)下載後解壓便可。 
   3.執行建立win服務的命令。在cmd運行窗口,cd到JavaService的目錄,輸入JavaService.exe -install myService "%JAVA_HO 
ME%"\jre\bin\client\jvm.dll  -Djava.class.path="JAVA_HOME"\lib\tools.jar;F:\myec 
lipse3\javaservice\bin -start Logservice 
(其中,myService爲建立的服務名稱,%JAVA_HO 
ME%"\jre\bin\client\jvm.dll爲jdk中jre的jvm虛擬機,F:\myec 
lipse3\javaservice\bin爲我LogService.class的存在路徑,請你們根據本身的類文件進行修改。 
需注意問題:JavaService 不支持C:Program Files中間的空格,因此找不到JVM;固儘可能使用"JAVA_HOME",而不要直接用jdk的路徑;使用%JAVA_HOME%時又必須在其上加雙引號才行,即"%JAVA_HOME%") 

能夠執行服務啦,OK
adiOS

相關文章
相關標籤/搜索