Bắt đầu dịch vụ trong Android


115

Tôi muốn gọi một dịch vụ khi một hoạt động nhất định bắt đầu. Vì vậy, đây là lớp Dịch vụ:

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

Và đây là cách tôi gọi nó:

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

Vấn đề là không có gì xảy ra. Khối mã trên được gọi vào cuối hoạt động onCreate. Tôi đã gỡ lỗi và không có ngoại lệ nào được ném ra.

Bất kỳ ý tưởng?


1
Cẩn thận với Bộ hẹn giờ - AFAIK khi dịch vụ của bạn ngừng hoạt động để giải phóng tài nguyên, bộ hẹn giờ này sẽ không khởi động lại khi dịch vụ được khởi động lại. Bạn đúng START_STICKYsẽ khởi động lại dịch vụ, nhưng sau đó chỉ onCreate được gọi và var hẹn giờ sẽ không được khởi tạo lại. Bạn có thể START_REDELIVER_INTENTsử dụng dịch vụ Báo thức hoặc Trình lập lịch công việc API 21 để khắc phục điều này.
Georg

Trong trường hợp bạn quên, hãy đảm bảo rằng bạn đã đăng ký dịch vụ trong tệp kê khai android bằng cách sử dụng <service android:name="your.package.name.here.ServiceClass" />trong thẻ ứng dụng.
Japheth Ongeri - inkalimeva

Câu trả lời:


278

Có thể bạn không có dịch vụ trong tệp kê khai của mình hoặc không có dịch vụ <intent-filter>phù hợp với hành động của bạn. Kiểm tra LogCat (thông qua adb logcat, DDMS hoặc phối cảnh DDMS trong Eclipse) sẽ đưa ra một số cảnh báo có thể hữu ích.

Nhiều khả năng, bạn nên bắt đầu dịch vụ qua:

startService(new Intent(this, UpdaterServiceManager.class));

1
Làm thế nào bạn có thể gỡ lỗi? không bao giờ được gọi là dịch vụ của tôi, debugg của tôi không hiển thị gì cả
delive

Thêm hàng loạt thẻ Log.e ở mọi nơi: Trước khi bạn khởi chạy dịch vụ, là kết quả của mục đích dịch vụ, bên trong lớp dịch vụ nơi nó sẽ di chuyển (onCreate, onDestroy, bất kỳ và tất cả các phương thức).
Zoe

Nó hoạt động cho các ứng dụng của tôi trên android sdk 26+ nhưng liều lượng thì không trên android sdk 25 trở xuống. có bất kỳ giải pháp?
Mahidul Islam

@MahidulIslam: Tôi khuyên bạn nên hỏi một câu hỏi Stack Overflow riêng biệt, nơi bạn có thể cung cấp một ví dụ có thể tái tạo tối thiểu giải thích chi tiết hơn về vấn đề và các triệu chứng của bạn.
CommonsWare

@CommonsTôi đã đặt một câu hỏi và đó là: - stackoverflow.com/questions/49232627/…
Mahidul Islam,

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

Chỉ viết dòng này là không đủ đối với tôi. Dịch vụ vẫn không hoạt động. Mọi thứ chỉ hoạt động sau khi đăng ký dịch vụ tại tệp kê khai

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

    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>

1
Ví dụ tốt nhất để học các dịch vụ liên quan đến tất cả mọi thứ trong Android coderzpassion.com/implement-service-android và xin lỗi vì đến trễ
Jagjit Singh

55

Mã Java cho dịch vụ bắt đầu :

Bắt đầu dịch vụ từ Hoạt động :

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

Bắt đầu dịch vụ từ 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");
    }

}

Xác định Dịch vụ này thành Tệp kê khai của Dự án:

Thêm bên dưới thẻ trong Manifest file:

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

Làm xong


7
Nó cải thiện hiệu suất bao nhiêu khi tôi để các hoạt động và dịch vụ trong cùng một gói? Chưa bao giờ nghe thấy điều đó trước đây.
OneWorld

Có lẽ chúng có nghĩa là hiệu suất theo một nghĩa lỏng lẻo rất mơ hồ, không phải về tốc độ chạy?
Anubian Noob

3

Tôi muốn làm cho nó năng động hơn

Class<?> serviceMonitor = MyService.class; 


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

đừng quên Bản kê khai

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

1
Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

thêm dịch vụ vào danh sách kê khai

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

để chạy dịch vụ trên oreo và các thiết bị lớn hơn, sử dụng cho dịch vụ mặt đất và hiển thị thông báo cho người dùng

hoặc sử dụng dịch vụ hàng rào địa lý để cập nhật vị trí trong tham chiếu nền http://stackoverflow.com/questions/tagged/google-play-services

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.