Latest web development tutorials

Androidのサービス(サービス)

サービスはバックグラウンドで実行されているコンポーネント、長時間実行されるタスクの実装であり、ユーザーの操作を必要としません。 アプリケーションはまた、破壊されても、まだ動作します。 基本的に2つの状態を備えるサービス -

状態 説明
開始 そのような活動のようなAndroidアプリケーションのコンポーネントは、STARTSERVICEを通して()サービスを開始するには、サービスの状態が開始されます。 開始すると、サービスは無期限に、そのコンポーネントのタイムリーな打ち上げが破壊されているバックグラウンドで実行することができます。
バウンド bindService()を介してAndroidのアプリケーションコンポーネントがサービスをバインドすると、サービスは束縛状態です。 結合した状態のサービスは、偶数IPCを介してプロセス間通信のために、結果を得るための要求を送信するように、コンポーネントがサービスと対話することを可能にするクライアント・サーバ・インタフェースを提供します。

サービスライフサイクルアプローチでは、サービスのステータスの変更の適切な段階で行うことが可能とを監視するように実装することができました。 サービスは()STARTSERVICE時に申告期間によって作成されたときに、次は左を示しているサービスは()bindServiceのライフサイクルによって作成されたとき、右が表示されます。

絵絵

サービスを作成するには、基本クラスのサービスまたはその既知のサブクラスでは、Javaクラスから継承するクラスを作成する必要があります。 サービスの基本クラスは、さまざまな方法で最も重要なコールバックメソッドを定義します。 あなたは、コールバックメソッドのすべてを実装する必要はありません。 それにもかかわらず、すべてのメソッドを理解することは非常に重要です。 これらのコールバックは、ユーザの所望の方法にそのアプリケーションを確保することができます。

コールバック 説明
onStartCommand() (そのような活性など)の他のコンポーネントのサービス要求を開始するSTARTSERVICE()を呼び出すことによって、システムは、メソッドを呼び出します。 このメソッドを実装する場合は、作業がstopSelf()またはstopService()メソッドによって完成されたときにサービスを停止する責任があります。
[OnBind]の あなたはbindService()を介して他のコンポーネントとサービスをバインドすると、システムはメソッドを呼び出します。 このメソッドを実装する場合は、顧客がサービスと通信するためのインタフェースを提供するために、IBinderオブジェクトを返す必要があります。 あなたが結合許可していない場合は、単にnullを返し、このメソッドを実装する必要があります。
onUnbind() すべての特殊割り込みサービスリリースのための顧客インタフェースは、システムは、メソッドを呼び出すと。
onRebind() サービスにすると、新しいクライアント接続、およびそれがonUnbind(インテント)の通知により切断された後、システムは、メソッドを呼び出します。
onCreate() onStartCommand()と[OnBind]の()を介してサービスを初めて作成したとき、システムは、メソッドを呼び出します。 コールは、1回限りのインストールを実装する必要があります。
onDestroy() サービスが有用または破壊されなくなった場合に、システムがメソッドを呼び出しません。 あなたのサービスでは、というように、スレッド、登録されたリスナー、受信機、およびなどの任意のリソースをクリーンアップするために、このメソッドを実装する必要があります。

以下の主なサービスは、各メソッドのライフサイクルを示しています -

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アプリケーションを変更する手順に従います。

ステップ 説明
1 cn.uprogrammer.androidservicesパッケージでAndroidアプリケーションと名前androidservicesを作成するには、Android StudioのIDEを使用しました。 同様の例Hello Worldのセクション。
2 変更の主なアクティブなファイルMainActivity.java追加STARTSERVICE()とstopService()メソッド。
3 パッケージcn.uprogrammer.androidservicesに新しいJavaファイルMyService.javaを作成します。 このファイルには、Androidのサービス関連のメソッドになります。
4 サービスを定義するには、AndroidManifest.xmlをファイル内の<service ... />タグを使用します。 アプリケーションは、特に制限はなく、1つ以上のサービスを有することができます。
5 デフォルトのレイアウトでのres /レイアウト/ activity_main.xmlファイルを変更し、オンラインレイアウトは、2つのボタンが含まれています。
6 解像度/値は、/変更する任意の定数ファイルのstrings.xmlしないでください。 Androidのスタジオは、文字列値をメモします。
7 アプリケーションを実行し、アプリケーションに加えられた変更の結果を確認するために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の内容です。 このファイルには、需要に基づく方法に関連する1つまたは複数のサービスを実装することができます。 新規参入者のために、我々は唯一の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ファイルを変更します。 ここに当社のサービスを含めるように<サービス... />タグを追加します。

<?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>

解像度/レイアウト/ activity_main.xmlファイルの内容がされている以下の2つのボタンが含まれています。

<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 /値/のstrings.xmlの内容は、2つの新しい定数を定義することですされています。

<?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>

ちょうど変更された私のアプリケーションのアプリケーションを実行してみましょう。 私は、インストール環境中にAVDを作成したと仮定します。 アクティブなファイルでプロジェクトを開き、ツールバーのをクリック 絵 アンドロイドStudioでアプリケーションを実行するためのアイコン。 Androidのメーカーは、AVD上でアプリケーションをインストールし、それを開始します。 すべてがうまくいけば、次のようにエミュレータウィンドウに表示されます。

絵

ここで、次のように実行されるサービスを、開始するには、「サービスの開始」ボタンをクリックしonStartCommand我々は()メソッドを記述し、「サービスが開始されました」というメッセージは、シミュレータの下部に表示されます:

絵

「アウトオブサービス」ボタンの下をクリックして、サービスを停止することができます。