2013-04-02 31 views
54

Tôi đã tạo một dịch vụ và luôn muốn chạy dịch vụ này cho đến khi điện thoại của tôi khởi động lại hoặc bị đóng. Dịch vụ sẽ chạy ở chế độ nền.Dịch vụ Android cần chạy luôn (Không bao giờ tạm dừng hoặc dừng)

Mẫu mã của dịch vụ tạo và các dịch vụ bắt đầu:

Bắt đầu dịch vụ:

Intent service = new Intent(getApplicationContext(), MyService.class); 
getApplicationContext().startService(service); 

Các dịch vụ:

public class MyService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // TODO do something useful 
     HFLAG = true; 
     //smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000); 
     return Service.START_NOT_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO for communication return IBinder implementation 
     return null; 
    } 
} 

Manifest khai:

<service 
    android:name=".MyService" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
</service> 

Có thể chạy dịch vụ này luôn như khi ứng dụng tạm dừng và bất kỳ điều gì khác. Sau một thời gian, đơn đăng ký của tôi sẽ tạm dừng và các dịch vụ cũng sẽ tạm dừng hoặc ngừng. Vì vậy, làm thế nào tôi có thể chạy dịch vụ này trong nền và luôn luôn.

+1

Không thể làm cho nó trở thành một phần của hình ảnh hệ thống. Android có thể giết hoàn toàn ứng dụng của bạn trong một số trường hợp. Khi ứng dụng của bạn bị giết, các dịch vụ của nó sẽ không còn hoạt động. – StarPinkER

+2

Cảm ơn bạn đã trả lời, Làm thế nào tôi có thể làm cho ứng dụng của tôi như là một phần của hình ảnh hệ thống. –

+0

Bạn cần sửa đổi phần sụn. Nếu điều này là chấp nhận được, tôi có thể viết một câu trả lời. – StarPinkER

Trả lời

5

Để bắt đầu dịch vụ theo quy trình riêng, bạn phải chỉ định thông tin sau trong khai báo xml.

<service 
    android:name="WordService" 
    android:process=":my_process" 
    android:icon="@drawable/icon" 
    android:label="@string/service_name" 
    > 
</service> 

Ở đây bạn có thể tìm thấy một hướng dẫn tốt đó là thực sự hữu ích với tôi

http://www.vogella.com/articles/AndroidServices/article.html

Hope this helps

+0

android: name = "WordService" có nghĩa là đối với MyService –

+1

Có u có tu poout tên riêng của bạn – Juan

+0

@juan: bạn phải kiểm tra điều này: http://developer.android.com/guide/topics/manifest/service-element.html –

2

Bạn có thể thực hiện startForeground cho các dịch vụ và thậm chí nếu nó chết bạn có thể khởi động lại bằng cách sử dụng START_STICKY trên startCommand(). Không chắc chắn mặc dù đây là việc thực hiện đúng.

75

"Có thể chạy dịch vụ này luôn như khi ứng dụng tạm dừng và bất kỳ điều gì khác không?"

Có.

  1. Trong dịch vụ onStartCommand return return START_STICKY.

    public int onStartCommand(Intent intent, int flags, int startId) { 
         return START_STICKY; 
    } 
    
  2. Bắt đầu dịch vụ ở chế độ nền bằng startService (MyService) để luôn hoạt động bất kể số lượng khách hàng bị ràng buộc.

    Intent intent = new Intent(this, PowerMeterService.class); 
    startService(intent); 
    
  3. Tạo chất kết dính.

    public class MyBinder extends Binder { 
         public MyService getService() { 
           return MyService.this; 
         } 
    } 
    
  4. Xác định kết nối dịch vụ.

    private ServiceConnection m_serviceConnection = new ServiceConnection() { 
         public void onServiceConnected(ComponentName className, IBinder service) { 
           m_service = ((MyService.MyBinder)service).getService(); 
         } 
    
         public void onServiceDisconnected(ComponentName className) { 
           m_service = null; 
         } 
    }; 
    
  5. Kết nối với dịch vụ bằng bindService.

     Intent intent = new Intent(this, MyService.class); 
         bindService(intent, m_serviceConnection, BIND_AUTO_CREATE); 
    
  6. Đối với dịch vụ, bạn có thể muốn thông báo khởi chạy hoạt động thích hợp khi hoạt động đã đóng.

    private void addNotification() { 
         // create the notification 
         Notification.Builder m_notificationBuilder = new Notification.Builder(this) 
           .setContentTitle(getText(R.string.service_name)) 
           .setContentText(getResources().getText(R.string.service_status_monitor)) 
           .setSmallIcon(R.drawable.notification_small_icon); 
    
         // create the pending intent and add to the notification 
         Intent intent = new Intent(this, MyService.class); 
         PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
         m_notificationBuilder.setContentIntent(pendingIntent); 
    
         // send the notification 
         m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build()); 
    } 
    
  7. Bạn cần phải sửa đổi tệp kê khai để khởi chạy hoạt động ở chế độ đơn hàng đầu.

      android:launchMode="singleTop" 
    
  8. Lưu ý rằng nếu hệ thống cần tài nguyên và dịch vụ của bạn không hoạt động thì có thể bị giết. Nếu điều này là không thể chấp nhận, hãy mang dịch vụ tới nền trước bằng startForeground.

     startForeground(NOTIFICATION_ID, m_notificationBuilder.build()); 
    
+0

Sau một thời gian dịch vụ này tự động chuyển sang chế độ ngủ bằng cách sử dụng tính năng này. –

+0

Ý bạn là "đi ngủ bằng cách sử dụng cái này"? Có, thỉnh thoảng dịch vụ có thể bị hệ thống giết chết nhưng dịch vụ sẽ tự động được khởi động lại khi sử dụng START_STICKY. –

+0

Câu trả lời rất hay - nó hoạt động hoàn hảo. Nhiều câu trả lời khác cho các câu hỏi tương tự là một phần trong khi câu hỏi này hoàn tất. –

3

Một giải pháp đơn giản là để khởi động lại dịch vụ khi hệ thống dừng nó.

tôi thấy thực hiện rất đơn giản này của phương pháp này:

How to make android service unstoppable

1

Nếu bạn đã có một dịch vụ và muốn nó làm việc mọi lúc, bạn cần phải thêm 2 điều:

  1. trong dịch vụ:

    public int onStartCommand(Intent intent, int flags, int startId) { 
        return START_STICKY; 
    } 
    
  2. Trong tệp kê khai:

    android:launchMode="singleTop" 
    

Không cần phải thêm ràng buộc trừ khi bạn cần nó trong dịch vụ.

1

Tôi đã tìm thấy cách đơn giản và rõ ràng để giữ luôn luôn hoạt động của Service.

Anh chàng này đã giải thích rõ ràng và đã sử dụng thuật toán tốt. Cách tiếp cận của anh ta là gửi một Broadcast khi dịch vụ sắp bị giết và sau đó sử dụng nó để khởi động lại dịch vụ.

Bạn nên kiểm tra: http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

+0

Tính năng này hoạt động như thế nào trong Android O, điều này không cho phép người nhận phát trong nền bắt đầu một dịch vụ? – Michael

0

Thêm điều này vào tệp kê khai.

 <service 
     android:name=".YourServiceName" 
     android:enabled="true" 
     android:exported="false" /> 

Thêm lớp dịch vụ.

public class YourServiceName extends Service { 


    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Timer task makes your service will repeat after every 20 Sec. 
     TimerTask doAsynchronousTask = new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         // Add your code here. 

        } 

       }); 
      } 
     }; 
    //Starts after 20 sec and will repeat on every 20 sec of time interval. 
     timer.schedule(doAsynchronousTask, 20000,20000); // 20 sec timer 
           (enter your own time) 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // TODO do something useful 

     return START_STICKY; 
    } 

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