2014-10-18 26 views
7

Tôi có dịch vụ nền trong ứng dụng Android của mình, tôi bắt đầu dịch vụ từ phương thức MainActivity onResume() và nó hoạt động đúng cách. Nhưng làm thế nào tôi có thể ngừng dịch vụ khi người dùng nhấn nút home.Bởi vì hiện tại người sử dụng bấm nút home sau đó ứng dụng chuyển sang nền và sau đó người dùng mở một số ứng dụng khác thì sau một thời gian phương pháp dịch vụ của tôi được gọi và lực lượng ứng dụng stop.Below là mã của tôi cho dịch vụ bắt đầu -Dừng dịch vụ nền Khi ứng dụng chạy đến nền

Intent msgIntent = new Intent(mContext, MyBackgroundService.class); 
     startService(msgIntent); 

Cảm ơn trước.

EDITED

Trong Dịch vụ My tôi sử dụng bên dưới mã -

public void callAsynchronousTask() { 
final Handler handler = new Handler(); 
timer = new Timer(); 
TimerTask doAsynchronousTask = new TimerTask() {  
    @Override 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() {  
       try { 
        callWebservice(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
}; 
timer.schedule(doAsynchronousTask, START_DELAY, DELAY); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    callAsynchronousTask(); 
    return Service.START_NOT_STICKY; 
} 

@Override 
public void onCreate() { 
    mContext = this; 
    super.onCreate(); 
} 

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

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

trong hoạt động của tôi tôi sử dụng bên dưới mã cho dừng dịch vụ -

@Override 
protected void onStop() { 
    try{ 
     stopService(new Intent(this, MyBackgroundService.class)); 
     isServiceRunning = false; 
    } 
    catch(Exception e){ 
    e.printStackTrace(); 
    } 
    super.onStop(); 
} 

@Override 
protected void onPause() { 
    try{ 
     stopService(new Intent(this, MyBackgroundService.class)); 
     isServiceRunning = false; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    super.onPause(); 
} 

nhưng dịch vụ của tôi được chạy trong khi tôi sử dụng một số ứng dụng khác và nó buộc dừng app.From dịch vụ nền tôi gọi một số webservice và sau đó lưu trữ phản ứng của dịch vụ trong cơ sở dữ liệu.

Trả lời

5

Dừng dịch vụ trong onPause() và onStop()

mContext.stopService(new Intent(mContext, 
        MyBackgroundService.class)) 
0

bấm Home Nút nguyên nhân OnPause() chức năng. Override onPause() và gọi stopService: mContext.stopService (Ý định mới (mContext, MyBackgroundService.class))

+0

Vui lòng kiểm tra câu hỏi cập nhật.Bởi vì tôi đã thử mã nhưng ứng dụng vẫn gặp sự cố trong khi ứng dụng ở chế độ nền và một số ứng dụng khác đang chạy. – Ravi

1
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode==KeyEvent.KEYCODE_HOME){ 
      Log.e("home key pressed", "****"); 

// viết mã của bạn vào đây để ngăn chặn hoạt động enter code here

 } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    protected void onPause() { 
     Log.e("home key pressed on pause", "****"); 
     // write your code here to stop your service 
     super.onPause();  
    } 

sự mã trên sẽ tiếp tục kiểm tra xem người dùng đã nhấn nút home hay chưa.

+1

Tôi đã thử mã của bạn nhưng khi nhấn nút Home thì phương thức onKeyDown không được gọi. – Ravi

+0

Vui lòng kiểm tra câu hỏi cập nhật – Ravi

+0

của bạn, bạn phải cập nhật ui từ dịch vụ nền của bạn có thể gây ra sự cố. nếu vậy bạn cần phải áp dụng một kiểm tra cho bối cảnh hoạt động của bạn và làm cho nó null on onPause và Onkey xuống phương pháp sau đó trước khi cập nhật ui làm cho kiểm tra cho nó. – amit

1

khi chúng tôi mở các ứng dụng khác thì ứng dụng của chúng tôi (đã ở chế độ nền) bị xóa khỏi bộ nhớ Tuy nhiên, toàn bộ ứng dụng không bị xóa nhưng một số dữ liệu và hoạt động không mong muốn được hoàn tất. Trong trường hợp của bạn, hoạt động sẽ được cập nhật sẽ bị xóa khỏi bộ nhớ và dịch vụ nền đang chạy của bạn khi cố gắng cập nhật giao diện người dùng sau đó nó sẽ bị lỗi bằng cách ném NullPointerException. Vì vậy, hãy lưu tham chiếu của activty (có giao diện người dùng sẽ được cập nhật) trong onCreate() và đặt tham chiếu thành null trong phương thức finish() sau đó kiểm tra tham chiếu này trong dịch vụ nền nếu nó không phải là null sau đó cập nhật giao diện người dùng khác không cần cập nhật.

// Global Class for saving the reference 
class GlobalReference{ 
     public static <name_of_your_activity> activityRef; 
} 

trong hoạt động của bạn

onCreate(){ 
    GlobalReference.activityRef = this; 
} 


finish(){ 
    GlobalReference.activityRef = null; 
} 

Trong dịch vụ nền của bạn

if(GlobalReference.activityRef != null){ 
    // update the UI of your activity 
} 

Hope mã này sẽ giải quyết vấn đề của bạn. Happy Coding ...

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