Latest web development tutorials

خدمة الروبوت (الخدمة)

الخدمة هي عنصر تعمل في الخلفية، وتنفيذ مهمة طويلة الامد ولا تتطلب تفاعل المستخدم. حتى لو تم تدمير التطبيق أيضا لا تزال تعمل. الخدمات المكونة أساسا دولتين -

دولة وصف
التي مكونات التطبيق الروبوت، مثل الأنشطة، من خلال startService () لبدء تشغيل خدمة، يتم تشغيل خدمة الدولة. بدأت مرة واحدة، يمكن تشغيل الخدمة في الخلفية إلى أجل غير مسمى، ودمرت إطلاقنا من مكوناته.
مقيد عندما مكونات التطبيق الروبوت من خلال bindService () لربط الخدمة، وخدمة الدولة منضم. توفر خدمة الدولة ملزمة واجهة خدمة العملاء للسماح للمكونات للتفاعل مع هذه الخدمة، مثل إرسال طلب للحصول على النتائج، حتى للاتصال بين العملية من خلال التصنيف الدولي للبراءات.

لديها خدمة نهج دورة حياة يمكن تنفيذها لرصد التغيرات حالة الخدمة يمكن القيام بها في المرحلة المناسبة. ويبين الجدول التالي اليسار عندما يتم إنشاء خدمة () من خلال startService عندما يتم عرض حق فترة إعلان عند إنشاء خدمة () من خلال دورة حياة bindService:

صورصور

لإنشاء الخدمة، تحتاج إلى إنشاء فئة يرث من خدمة قاعدة الطبقة أو الطبقات في جاوة فرعية المعروفة. وتعرف الفئة الأساسية خدمة أساليب مختلفة وطريقة الاستدعاء الأكثر أهمية. أنت لا تحتاج إلى تنفيذ جميع طريقة الاستدعاء. ومع ذلك، من أجل فهم كل الطرق مهم جدا. ويمكن لهذه الاسترجاعات ضمان أن التطبيق الخاص بك إلى الطريقة المستخدم المطلوب.

رد وصف
onStartCommand () المكونات الأخرى (مثل النشاط) من خلال الدعوة startService () لبدء طلب الخدمة، ويدعو إلى نظام الطريقة. إذا قمت بتطبيق هذا الأسلوب، لديك مسؤولية لإيقاف الخدمة عند اكتمال العمل stopSelf () أو stopService () طريقة.
onBind عندما تريد ربط المكونات والخدمات الأخرى من خلال bindService ()، ويدعو إلى نظام الطريقة. إذا قمت بتطبيق هذا الأسلوب، تحتاج إلى العودة الكائن IBinder لتوفير واجهة للعملاء التواصل مع الخدمة. يجب تطبيق هذه الطريقة، إذا كنت لا تسمح ملزمة، والعودة ببساطة لاغية.
onUnbind () عندما واجهة العملاء لجميع الافراج خدمة المقاطعة خاص، ويدعو إلى نظام الطريقة.
onRebind () عند وجود اتصال عميل جديد في الخدمة، وبعد أن تم قطع الاتصال من قبل onUnbind (النوايا) الإخطار، يدعو نظام الطريقة.
OnCreate الخاص () عند إنشاء الخدمات من خلال onStartCommand () وonBind () أولا، ويدعو إلى نظام الطريقة. تتطلب دعوة تنفيذ تثبيت لمرة واحدة.
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() {

    }
}

أمثلة

هذا المثال سوف تظهر لك خطوات بسيطة حول كيفية إنشاء خدمة الروبوت الخاص بك. اتبع هذه الخطوات لتعديل الروبوت التي تم إنشاؤها مسبقا في القسم أمثلة مرحبا العالم:

خطوة وصف
1 باستخدام الروبوت ستوديو IDE لإنشاء تطبيق الروبوت وandroidservices اسم في حزمة cn.uprogrammer.androidservices. قسم مرحبا العالم أمثلة مشابهة.
2 تعديل MainActivity.java ملف نشطة الرئيسية إضافة startService () وطريقة stopService ().
3 إنشاء MyService.java ملف جافا الجديد في cn.uprogrammer.androidservices الحزمة. سيكون هذا الملف جعل الروبوت أساليب الخدمات ذات الصلة.
4 لتحديد استخدام خدمات <خدمة ... /> العلامة في ملف AndroidManifest.xml على. تطبيق يمكن أن يكون خدمة واحدة أو أكثر من دون أي قيود.
5 تعديل RES / تخطيط / ملف activity_main.xml في التخطيط الافتراضي والتصميم على الانترنت يحتوي على اثنين من الأزرار.
6 لا RES / القيم / strings.xml أي ملف الثوابت التي يمكن تعديلها. الروبوت سوف ستوديو ملاحظة قيمة السلسلة.
7 إطلاق محاكي أندرويد لتشغيل التطبيق والتحقق من نتائج التغييرات التي أدخلت على التطبيق.

هنا هو ملف النشاط ملف 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 على. هنا إضافة <خدمة ... /> العلامة لتشمل خدماتنا:

<?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 / تخطيط / ملف 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 / القيم / 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>

دعونا فقط تشغيل معدلة تطبيق طلبي. أفترض أنك قمت بإنشائها AVD خلال بيئة التثبيت. فتح مشروعك في الملف النشط، انقر على شريط الأدوات صور رمز لتشغيل التطبيق في الروبوت الاستوديو. الروبوت ستوديو تثبيت التطبيق على AVD وبدء تشغيله. إذا سارت الامور بشكل جيد، وسوف يتم عرضها على نافذة المحاكي على النحو التالي:

صور

الآن انقر على زر "ابدأ الخدمة" لبدء الخدمة، والتي سيتم تنفيذ onStartCommand نكتب طريقة ()، "لقد تم إطلاق خدمة" وتظهر رسالة في الجزء السفلي من جهاز محاكاة، على النحو التالي:

صور

انقر على الجزء السفلي من زر "خارج الخدمة"، يمكنك إيقاف الخدمة.