Mulai layanan di Android

115

Saya ingin memanggil layanan ketika aktivitas tertentu dimulai. Jadi, inilah kelas Service:

public class UpdaterServiceManager extends Service {

    private final int UPDATE_INTERVAL = 60 * 1000;
    private Timer timer = new Timer();
    private static final int NOTIFICATION_EX = 1;
    private NotificationManager notificationManager;

    public UpdaterServiceManager() {}

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // Code to execute when the service is first created
    }

    @Override
    public void onDestroy() {
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        notificationManager = (NotificationManager) 
                getSystemService(Context.NOTIFICATION_SERVICE);
        int icon = android.R.drawable.stat_notify_sync;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, tickerText, when);
        Context context = getApplicationContext();
        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";
        Intent notificationIntent = new Intent(this, Main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText,
                contentIntent);
        notificationManager.notify(NOTIFICATION_EX, notification);
        Toast.makeText(this, "Started!", Toast.LENGTH_LONG);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // Check if there are updates here and notify if true
            }
        }, 0, UPDATE_INTERVAL);
        return START_STICKY;
    }

    private void stopService() {
        if (timer != null) timer.cancel();
    }
}

Dan inilah cara saya menyebutnya:

Intent serviceIntent = new Intent();
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager");
startService(serviceIntent);

Masalahnya adalah tidak ada yang terjadi. Blok kode di atas dipanggil di akhir aktivitas onCreate. Saya sudah men-debug dan tidak terkecuali terlempar.

Ada ide?

Miguel Ribeiro
sumber
1
Hati-hati dengan Pengatur Waktu - AFAIK ketika layanan Anda dimatikan untuk sumber daya gratis, pengatur waktu ini tidak akan dimulai ulang saat layanan dimulai ulang. Anda benar START_STICKYakan memulai ulang layanan, tetapi hanya onCreate yang dipanggil dan var pengatur waktu tidak akan diinisialisasi ulang. Anda dapat bermain dengan START_REDELIVER_INTENT, layanan Alarm atau Penjadwal Pekerjaan API 21 untuk memperbaikinya.
Georg
Jika Anda lupa, pastikan Anda telah mendaftarkan layanan di manifes android menggunakan <service android:name="your.package.name.here.ServiceClass" />dalam tag application.
Japheth Ongeri - inkalimeva

Jawaban:

278

Mungkin Anda tidak memiliki layanan dalam manifes Anda, atau tidak memiliki layanan <intent-filter>yang cocok dengan tindakan Anda. Memeriksa LogCat (via adb logcat, DDMS, atau perspektif DDMS di Eclipse) akan memunculkan beberapa peringatan yang dapat membantu.

Kemungkinan besar, Anda harus memulai layanan melalui:

startService(new Intent(this, UpdaterServiceManager.class));
CommonsWare
sumber
1
Bagaimana Anda bisa melakukan debugg? tidak pernah menelepon layanan saya, debugg saya tidak menunjukkan apa
berikan
Tambahkan sedikit tag Log.e di mana-mana: Sebelum Anda meluncurkan layanan, hasil dari maksud layanan, di dalam kelas layanan tempat ia akan melakukan perjalanan (onCreate, onDestroy, semua metode).
Zoe
Ini berfungsi untuk aplikasi saya di android sdk 26+ tetapi tidak pada android sdk 25 atau lebih rendah. ada solusinya?
Mahidul Islam
@MahidulIslam: Saya menganjurkan agar Anda mengajukan pertanyaan Stack Overflow terpisah, di mana Anda dapat memberikan contoh minimal yang dapat direproduksi yang menjelaskan masalah dan gejala Anda secara lebih mendetail.
CommonsWare
@CommonsWare saya sudah mengajukan pertanyaan dan itu: - stackoverflow.com/questions/49232627/…
Mahidul Islam
81
startService(new Intent(this, MyService.class));

Menulis baris ini saja tidak cukup bagi saya. Layanan masih tidak berfungsi. Semuanya bekerja hanya setelah mendaftarkan layanan di manifes

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>
Vitalii Korsakov
sumber
1
Contoh terbaik untuk mempelajari segala sesuatu tentang layanan di Android coderzpassion.com/implement-service-android dan maaf karena terlambat
Jagjit Singh
55

Kode Java untuk memulai layanan :

Mulai layanan dari Aktivitas :

startService(new Intent(MyActivity.this, MyService.class));

Mulai layanan dari Fragment :

getActivity().startService(new Intent(getActivity(), MyService.class));

MyService.java :

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 5000;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {

                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }

}

Tentukan Layanan ini ke dalam File Manifes Proyek:

Tambahkan tag di bawah ini di file Manifest :

<service android:enabled="true" android:name="com.my.packagename.MyService" />

Selesai

Hiren Patel
sumber
7
Seberapa besar peningkatan kinerja ketika saya meninggalkan aktivitas dan layanan dalam paket yang sama? Belum pernah mendengar itu sebelumnya.
OneWorld
Mungkin yang mereka maksud adalah kinerja dalam arti longgar yang sangat samar, bukan tentang kecepatan lari?
Anubian Noob
3

Saya suka membuatnya lebih dinamis

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); }
private void stopMyService()  { context.stopService(new Intent(context, serviceMonitor));  }

jangan lupakan Manifest

<service android:enabled="true" android:name=".MyService.class" />
Thiago
sumber
1
Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

tambahkan layanan di manifist

<service android:enabled="true" android:name="YourActivity.class" />

untuk menjalankan layanan di oreo dan perangkat yang lebih besar, gunakan untuk layanan darat dan tampilkan pemberitahuan kepada pengguna

atau gunakan layanan pembatasan wilayah untuk pembaruan lokasi di referensi latar belakang http://stackoverflow.com/questions/tagged/google-play-services

Asif Mehmood
sumber