2014-08-28 16 views
5

là nó có thể ngăn chặn Dịch vụ (startForground) bị giết bởi os? Tôi sử dụng nó để chơi âm thanh nhưng nó bị giết khi tôi sử dụng một ứng dụng khác đòi hỏi nhiều tài nguyên hơn (Angry birds go) trong một thời gian. Trong nhật ký, tôi thấy quá trình ứng dụng bị ActivityManager giết. Tôi nhân rộng cũng với một số ứng dụng âm thanh khác. Chỉ ứng dụng không bị giết là ứng dụng Play Âm nhạc. Nó đã được sao chép trên Android s3 android 4.3.Dịch vụ âm nhạc bị giết ngay cả khi startForground

+0

có thể luồng âm thanh đã bị ứng dụng ưu tiên cao hơn chiếm đoạt. – danny117

Trả lời

5

Có thể ngăn Dịch vụ (startForground) bị giết bởi os không?

No. Android là người quyết định quá trình nào phải dừng lại khi nào. Cách duy nhất là làm cho nó "kém hấp dẫn hơn để bị ngừng lại" bằng cách giảm lượng bộ nhớ mà nó tiêu thụ.

Lưu bộ nhớ. Đưa dịch vụ vào quy trình rất nhỏ của riêng mình. Vì vậy, os android có thể giết chết quá trình chính để đòi lại bộ nhớ và dịch vụ của bạn có thể tiếp tục chạy. Duy trì một mã dịch vụ nhỏ bằng cách chuyển thiết lập và các tùy chọn với mục đích được sử dụng để khởi động dịch vụ.

Lưu ý: Dịch vụ nhỏ phải là dịch vụ nền trước, nghĩa là phải hiển thị biểu tượng trên thanh trạng thái.

manifest cho quá trình riêng biệt

 <service 
     android:name="com.gosylvester.bestrides.ServiceLocationRecorder" 
     android:process=":bestRidesService" > 
    </service> 
</application> 

vượt qua trong cài đặt với mục đích sử dụng để bắt đầu dịch vụ. Chỉ cần khởi động lại dịch vụ để thay đổi cài đặt.

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    boolean isTrackerMarker = SettingMarker.TRACKER_MARKER_DEFAULT; 
    if (intent != null) { 
     // intent is processing = b 
     isMiles = intent.getBooleanExtra(
       SettingApplication.APPLICATION_MILE, 
       SettingApplication.APPLICATION_MILE_DEFAULT); 
     isRecordAccuracy = intent.getBooleanExtra(
       SettingRecord.RECORD_ACCURACY, 
       SettingRecord.RECORD_ACCURACY_DEFAULT); 
     locationInterval = intent.getLongExtra(SettingRecord.RECORD_MIlLIS, 
       SettingRecord.RECORD_PRESET_MEDIUM_MILLIS); 
     startMillis = intent.getLongExtra(BUNDLE_START_MILLIS, 0); 
     distance = intent.getDoubleExtra(
       ServiceLocationRecorder.BUNDLE_TRACKED_DISTANCE, 0); 
     recordDistance = (float) intent.getIntExtra(
       SettingRecord.RECORD_DISTANCE, 
       SettingRecord.RECORD_PRESET_MEDIUM_DISTANCE); 
     boolean newIsRecording = intent.getBooleanExtra(
       SettingRecord.RECORDING, isRecording); 

     isTrackerMarker = intent.getBooleanExtra(
       SettingMarker.TRACKER_MARKER, 
       SettingMarker.TRACKER_MARKER_DEFAULT); 
     startRecording(newIsRecording); 
    } 
+0

Cảm ơn. Tôi đã thử nó. Tôi đưa dịch vụ vào quá trình khác nhau nhưng tôi cũng bị giết bởi người quản lý ứng dụng sau quá trình chính. Tôi cũng đặt android.os.Process.setThreadPriority (android.os.Process.THREAD_PRIORITY_AUDIO); nhưng nó không giúp được – vandzi

+0

@vandzi tiếp tục tìm kiếm xin lỗi tôi đã không thể giúp đỡ. – danny117

+0

Tôi đã thêm một số chi tiết khác vào câu trả lời. Dịch vụ nhỏ phải là dịch vụ nền trước. Điều này làm giảm xác suất bị giết. Không có giải pháp tốt hơn cho Android. –

1

Bạn đã cố gắng yêu cầu lấy nét và kiểm soát và mất nó? Tôi nghĩ rằng quản lý ứng dụng này là xa kiểm soát của chúng tôi, nhưng ít nhất bạn có thể làm điều gì đó khi điều này xảy ra.

Tại một thời điểm nào của chu kỳ ứng dụng của bạn, hãy thử một cái gì đó như thế này:

audioManager.requestAudioFocus(new OnAudioFocusChangeListener() { 

     @Override 
     public void onAudioFocusChange(int focusChange) { 
      switch (focusChange) { 
       case AudioManager.AUDIOFOCUS_GAIN: 
        // you have the focus, you can start or restarting playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS: 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
        // you lost the focus, you should pause or stop playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
        // you lost the focus, but your app can continue playing in "duck" mode 
        break; 
       default: 
      } 

     } 
    }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 
+0

Cảm ơn bạn đã trả lời. Tôi giữ audiofocus – vandzi

0

Hãy nhìn vào câu trả lời của Foreground service being killed by Android bởi Robin Davies, có rất nhiều thông tin:

Just để tóm tắt, đây là cách mọi thứ được cho là hoạt động. Các dịch vụ đang chạy sẽ được dọn dẹp thường xuyên và chấm dứt sau mỗi 30 phút hoặc lâu hơn. Các dịch vụ muốn tồn tại lâu hơn điều này phải gọi Service.startForeground, nơi đặt thông báo trên thanh thông báo để người dùng biết rằng dịch vụ của bạn đang chạy vĩnh viễn và có khả năng hút tuổi thọ pin. Chỉ có 3 quy trình dịch vụ có thể tự đề cử là dịch vụ tiền cảnh tại bất kỳ thời điểm nào. Nếu có nhiều hơn ba dịch vụ tiền cảnh, android sẽ chỉ định dịch vụ lâu đời nhất làm ứng cử viên cho việc nhặt rác và chấm dứt.

Vì vậy, có lẽ có hơn 3 dịch vụ tiền cảnh? Ông cũng giải thích về các lỗi có thể xảy ra trong nền tảng khi ưu tiên các dịch vụ tiền cảnh.

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