2014-06-06 16 views
8

Câu hỏi của tôi là cách tạo dịch vụ nền luôn chạy. Tôi tạo ra một IntentService chạy trong nền miễn là ứng dụng đang chạy. Tuy nhiên, khi ứng dụng bị giết, dịch vụ cũng biến mất. Những gì tôi muốn tạo là tạo một dịch vụ nền luôn chạy và đăng thông báo. (Tương tự như whatsapp, facebook hoặc bất kỳ ứng dụng tương tự nào khác.)Cách tạo dịch vụ nền luôn chạy?

Khi thông báo được nhấp, nó cũng sẽ khởi động ứng dụng.

Tôi có thể làm như thế nào?

+0

Bạn đã xem thiết bị nhận cảnh báo và các mục đích đang chờ xử lý chưa? Họ có thể giữ một dịch vụ đang chạy kể cả khi điện thoại của bạn đang ngủ. – Chucky

+0

Nếu bạn tìm cách giữ cho dịch vụ của mình hoạt động, ngoài việc làm cho dịch vụ này trở thành dịch vụ nền trước, đó là lỗi chính của Android và có thể sẽ được khắc phục. (chỉnh sửa: hay không. hình như tôi không hiểu cách thức hoạt động của START_STICKY) – immibis

Trả lời

3

Bạn phải bắt đầu dịch vụ bằng lệnh bắt đầu. Và bạn phải viết lại onStartCommmand chức năng phục vụ:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("LocalService", "Received start id " + startId + ": " + intent); 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     return START_STICKY; 
    } 

START_STIKY có nghĩa là dịch vụ sẽ được khởi động lại automamtically (http://developer.android.com/reference/android/app/Service.html#START_STICKY)

Nếu bạn sử dụng bindService chức năng thay vì startCommand, dịch vụ của bạn sẽ ngừng sau đó tất cả activitiess binded đi xuống .

Hơn thế nữa nếu bạn muốn tự khởi động dịch vụ sau khi khởi động thiết bị, bạn phải thực hiện BroadcastReceiver để nhận được ACTION_BOOT_COMPLETED và xử lý sự kiện này cho dịch vụ bắt đầu.

10

cách tốt nhất để làm điều này là tạo dịch vụ tùy chỉnh mở rộng dịch vụ của bạn không nhằm mục đích Dịch vụ. và bắt đầu một chuỗi riêng biệt trong dịch vụ của bạn. bắt đầu dịch vụ trong việc tung ra ứng dụng Một điều quan trọng nữa là không ràng buộc nó với bất kỳ dịch vụ gây ra đối tượng nào sẽ bị tiêu diệt khi đối tượng của bạn bị phá hủy. sau đó phương thức onStartCommand() trả về START_STICKY Tôi sẽ cung cấp cho bạn việc triển khai mẫu.

public class CustomService extends Service { 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    return START_STICKY; 
} 

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    // TODO Auto-generated method stub 
    Intent restartService = new Intent(getApplicationContext(), 
       this.getClass()); 
     restartService.setPackage(getPackageName()); 
     PendingIntent restartServicePI = PendingIntent.getService(
       getApplicationContext(), 1, restartService, 
       PendingIntent.FLAG_ONE_SHOT); 

     //Restart the service once it has been killed android 


     AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI); 

} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 

    //start a separate thread and start listening to your network object 
} 

}

onTaskRemoved khởi động lại dịch vụ của bạn sau khi 100milli giây một lần nó bị giết. START_STICKY không hoạt động ở kitkat. Bạn phải thực hiện onTAskRemoved. Và một điều nữa nếu người dùng chuyển đến cài đặt ứng dụng và ngừng dịch vụ của bạn thì không có cách nào bạn có thể khởi động lại dịch vụ này

+0

Cảm ơn! , làm việc tốt cho các thiết bị huawei. – Mojtabye

+0

Xin chào Preethi Bạn có thể xem http://stackoverflow.com/questions/35200081/how-to-clear-an-app-if-it-is-running-in-background?noredirect=1#comment58116711_35200081 – Piku

+1

Nhận xét ở trên về ràng buộc là không chính xác. Nếu bạn đã được * chỉ * ràng buộc, có dịch vụ sẽ bị giết nếu bạn unbind, nhưng nếu bạn startService * đầu tiên * và sau đó ràng buộc, nó sẽ vẫn chạy mãi mãi. – strangetimes

0

Sau đây sẽ là hoạt động của bạn.

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

Thật không may khi ứng dụng của bạn bị giết và thiết bị hết tài nguyên, nó sẽ giết.
Nhưng nếu bạn muốn giữ cho dịch vụ của mình chạy trong nhiều ngày, hãy đảm bảo bạn đang chạy dịch vụ của mình ở nền trước.

Các vấn đề liên quan