即使在startForeground中音乐服务也被杀死了

时间:2014-08-28 15:57:43

标签: android android-service android-music-player

是否有可能阻止服务(startForground)被os杀死?我用它来播放音频,但是当我使用另一个需要更多资源(愤怒的小鸟去)的应用程序时它会被杀死。在日志中,我看到应用程序进程被ActivityManager杀死。我还复制了其他一些音频应用程序。只有未被杀的应用程序才是Play Music应用程序。 它被复制在samsung s3 android 4.3。

3 个答案:

答案 0 :(得分:5)

  

是否可以防止服务(startForground)被杀死   OS?

没有。这是Android决定哪个进程必须停止的时候。唯一的方法是通过减少消耗的内存量使其“不再被吸引”。

节省内存。将服务放入自己非常小的过程中。所以android os可以杀死主进程来回收内存,你的服务可以继续运行。通过传入用于启动服务的意图的设置和首选项来维护一个很小的服务代码。

注意:小型服务必须是前台服务,这意味着它必须在状态栏中显示一个图标。

显示单独的过程

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

传入具有启动服务的意图的设置。只需重新启动服务即可更改设置。

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

答案 1 :(得分:2)

您是否尝试过请求焦点和控制增益并丢失它?我认为这个应用程序管理远非我们的控制,但至少在发生这种情况时你可以做点什么。

在你的应用周期的某个时刻,尝试这样的事情:

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

答案 2 :(得分:0)

看看Foreground service being killed by Android的答案 罗宾戴维斯,有很多信息:

  

总结一下,这里的内容应该如何运作。运行服务将定期清理并每30分钟左右终止一次。希望保持活动时间超过此时间的服务必须调用Service.startForeground,它会在通知栏上发出通知,以便用户知道您的服务是永久运行的并且可能会耗尽电池寿命。在任何给定时间,只有3个服务流程可以指定自己作为前台服务。如果有三个以上的前台服务,android将提名最旧的服务作为清理和终止的候选者。

那么也许有3个以上的前台服务?他还在优先考虑前台服务时解释平台中可能存在的错误。