Android - Hizmetler

Bir servicekullanıcıyla etkileşime girmeye gerek kalmadan uzun süreli işlemleri gerçekleştirmek için arka planda çalışan ve uygulama yok edilse bile çalışan bir bileşendir. Bir hizmet temelde iki durumda olabilir -
Sr.No. Durum ve Açıklama
1

Started

Bir hizmet startedetkinlik gibi bir uygulama bileşeni, startService () öğesini çağırarak onu başlatır . Bir hizmet bir kez başlatıldığında, onu başlatan bileşen yok edilmiş olsa bile arka planda süresiz olarak çalışabilir.

2

Bound

Bir hizmet boundbir uygulama bileşeni bindService () çağırarak ona bağlandığında . Bağlı bir hizmet, bileşenlerin hizmetle etkileşime girmesine, istekler göndermesine, sonuç almasına ve hatta işlemler arası iletişim (IPC) ile süreçler genelinde bunu yapmasına olanak tanıyan bir istemci-sunucu arabirimi sunar.

Bir hizmet, hizmetin durumundaki değişiklikleri izlemek için uygulayabileceğiniz yaşam döngüsü geri arama yöntemlerine sahiptir ve işi uygun aşamada gerçekleştirebilirsiniz. Soldaki aşağıdaki şema, hizmet startService () ile oluşturulduğunda yaşam döngüsünü gösterir ve sağdaki şema, hizmet bindService () ile oluşturulduğunda yaşam döngüsünü gösterir: (görüntü nezaket: android.com)

Bir hizmet oluşturmak için, Hizmet temel sınıfını veya mevcut alt sınıflarından birini genişleten bir Java sınıfı oluşturursunuz. Servicetemel sınıf, çeşitli geri arama yöntemlerini tanımlar ve en önemlileri aşağıda verilmiştir. Tüm geri arama yöntemlerini uygulamanıza gerek yoktur. Ancak, her birini anlamanız ve uygulamanızın kullanıcıların beklediği gibi davranmasını sağlayanları uygulamanız önemlidir.

Sr.No. Geri arama ve Açıklama
1

onStartCommand()

Etkinlik gibi başka bir bileşen startService () 'i çağırarak hizmetin başlatılmasını istediğinde sistem bu yöntemi çağırır . Bu yöntemi uygularsanız , stopSelf () veya stopService () yöntemlerini çağırarak, işi tamamlandığında hizmeti durdurmak sizin sorumluluğunuzdadır .

2

onBind()

Başka bir bileşen bindService () 'i çağırarak hizmete bağlanmak istediğinde sistem bu yöntemi çağırır . Bu yöntemi uygularsanız, bir IBinder nesnesi döndürerek istemcilerin hizmetle iletişim kurmak için kullandıkları bir arabirim sağlamalısınız . Bu yöntemi her zaman uygulamalısınız, ancak bağlamaya izin vermek istemiyorsanız, null döndürmelisiniz .

3

onUnbind()

Sistem, tüm istemciler hizmet tarafından yayınlanan belirli bir arabirimle bağlantısı kesildiğinde bu yöntemi çağırır.

4

onRebind()

Sistem, yeni istemciler hizmete bağlandığında, onUnbind (Intent) içinde tüm bağlantının kesildiği bildirildikten sonra bu yöntemi çağırır .

5

onCreate()

Hizmet ilk olarak onStartCommand () veya onBind () kullanılarak oluşturulduğunda sistem bu yöntemi çağırır . Bu arama, tek seferlik kurulum yapmak için gereklidir.

6

onDestroy()

Sistem, hizmet artık kullanılmadığında ve yok edildiğinde bu yöntemi çağırır. Hizmetiniz bunu iş parçacıkları, kayıtlı dinleyiciler, alıcılar vb. Gibi kaynakları temizlemek için uygulamalıdır.

Aşağıdaki iskelet hizmeti, yaşam döngüsü yöntemlerinin her birini gösterir -

package com.tutorialspoint;

import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;

public class HelloService extends Service {
   
   /** indicates how to behave if the service is killed */
   int mStartMode;
   
   /** interface for clients that bind */
   IBinder mBinder;     
   
   /** indicates whether onRebind should be used */
   boolean mAllowRebind;

   /** Called when the service is being created. */
   @Override
   public void onCreate() {
     
   }

   /** The service is starting, due to a call to startService() */
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      return mStartMode;
   }

   /** A client is binding to the service with bindService() */
   @Override
   public IBinder onBind(Intent intent) {
      return mBinder;
   }

   /** Called when all clients have unbound with unbindService() */
   @Override
   public boolean onUnbind(Intent intent) {
      return mAllowRebind;
   }

   /** Called when a client is binding to the service with bindService()*/
   @Override
   public void onRebind(Intent intent) {

   }

   /** Called when The service is no longer used and is being destroyed */
   @Override
   public void onDestroy() {

   }
}

Misal

Bu örnek, kendi Android Hizmetinizi nasıl oluşturacağınızı göstermek için sizi basit adımlardan geçirecektir. Merhaba Dünya Örneği bölümünde oluşturduğumuz Android uygulamasını değiştirmek için aşağıdaki adımları izleyin -

Adım Açıklama
1 Bir Android uygulaması oluşturmak için Android StudioIDE'yi kullanacak ve Hello World Örneği bölümünde açıklandığı gibi com.example.tutorialspoint7.myapplication paketinin altında Uygulamam olarak adlandıracaksınız .
2 StartService () ve stopService () yöntemlerini eklemek için ana etkinlik dosyası MainActivity.java'yı değiştirin .
3 Yeni bir java dosyası MyService.java com.example.My Application paketi altında oluşturun . Bu dosya, Android hizmetiyle ilgili yöntemlerin uygulanmasına sahip olacaktır.
4 <Service ... /> etiketini kullanarak AndroidManifest.xml dosyasında hizmetinizi tanımlayın . Bir uygulama herhangi bir kısıtlama olmaksızın bir veya daha fazla hizmete sahip olabilir.
5 Res / layout / activity_main.xml dosyasının varsayılan içeriğini doğrusal düzende iki düğme içerecek şekilde değiştirin.
6 Res / values ​​/ strings.xml dosyasındaki herhangi bir sabiti değiştirmeye gerek yok . Android stüdyosu dizi değerleriyle ilgilenir
7 Android öykünücüsünü başlatmak ve uygulamada yapılan değişikliklerin sonucunu doğrulamak için uygulamayı çalıştırın.

Aşağıda, değiştirilen ana aktivite dosyasının içeriği yer almaktadır MainActivity.java. Bu dosya, temel yaşam döngüsü yöntemlerinin her birini içerebilir. Biz ekledik StartService () ve stopservice () başlatmak ve hizmeti durdurmak için yöntemler.

package com.example.tutorialspoint7.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
   String msg = "Android : ";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   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));
   }
}

Aşağıdakilerin içeriği MyService.java. Bu dosya, gereksinimlere göre Hizmet ile ilişkili bir veya daha fazla yöntemin uygulanmasına sahip olabilir. Şimdilik sadece iki yöntemi onStartCommand () ve onDestroy () uygulayacağız -

package com.example.tutorialspoint7.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

/**
   * Created by TutorialsPoint7 on 8/23/2016.
*/

public class MyService extends Service {
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
	
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Let it continue running until it is stopped.
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      return START_STICKY;
   }

   @Override
   public void onDestroy() {
      super.onDestroy();
      Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
   }
}

AndroidManifest.xml dosyasının değiştirilmiş içeriği aşağıdadır . Burada hizmetimizi dahil etmek için <service ... /> etiketi ekledik -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <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>

Aşağıdakilerin içeriği olacak res/layout/activity_main.xml iki düğme içerecek dosya -

<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="Example of services"
      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="Tutorials point "
      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/abc"
      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="Start Services"
      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="Stop Services"
      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>

Değiştirilmiş ürünümüzü çalıştırmayı deneyelim Hello World!az önce değiştirdiğimiz uygulama. Senin yarattığını varsayıyorumAVDortam kurulumu yapılırken. Uygulamayı Android stüdyosundan çalıştırmak için, projenizin etkinlik dosyalarından birini açın

ve araç çubuğundan Çalıştır simgesine tıklayın . Android Studio, uygulamayı AVD'nize yükler ve başlatır ve kurulumunuz ve uygulamanızla ilgili her şey yolundaysa, aşağıdaki Emulator penceresini görüntüler -

Şimdi hizmetinizi başlatmak için tıklayın Start Servicedüğmesi, hizmeti başlatır ve onStartCommand () yöntemindeki programlamamıza göre simülatörün altında aşağıdaki gibi bir Hizmet Başladı mesajı görünür -

Hizmeti durdurmak için Hizmeti Durdur düğmesine tıklayabilirsiniz.