当我打开许多Chrome标签时,为什么我的应用停止工作?

时间:2017-01-31 15:23:06

标签: android android-service

我正在开发一个简单的应用程序,它只是在后台播放声音,直到被用户杀死。问题是,当我在chrome中打开超过30-40个标签时,它会停止播放声音,我需要重新打开该应用。

我的智能手机只有1Gb的内存,但我注意到即使我打开超过100个Chrome标签,很多音乐播放器也能正常工作。

这是代码:

PlayerService.class:

public class PlayerService extends Service
{
    MediaPlayer mediaPlayer = null;

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

    @Override
    public void onCreate() {
        mediaPlayer = MediaPlayer.create(this, R.raw.song);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (!mediaPlayer.isPlaying()) {
            mediaPlayer.start();
        }
        return START_STICKY;
    }

    public void onDestroy() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        Log.i("PROVA SERVICE", "Distruzione Service");
    }

}

MainActivity.class:

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



    }

    public void play(View v)
    {

        startService(new Intent(this, PlayerService.class));
    }

    public void stop(View v)
    {

        stopService(new Intent(this, PlayerService.class));
    }
...

activity_main.xml中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="Play!" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:onClick="play"
        android:id="@+id/textView"
        android:layout_centerHorizontal="true"
        android:textStyle="bold"
        android:textSize="20dp" />

    <TextView android:text="Stop!" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:onClick="stop"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:textSize="20dp"
        android:textStyle="bold" />

</RelativeLayout>

我显然在清单中添加了服务:

<service android:name="PlayerService"/>

那么,问题是什么?

2 个答案:

答案 0 :(得分:2)

对于API级别5或更高版本,您可以使用startForeground()方法在前台启动服务。

该文件说

  

使此服务在前台运行,提供正在进行的服务   在此状态下向用户显示通知。默认情况下   服务是后台的,这意味着如果系统需要杀死它们   回收更多内存(例如在网络中显示大页面)   浏览器),他们可以在没有太大伤害的情况下被杀死。你可以设置它   如果查杀您的服务会对用户造成破坏,例如   如果您的服务正在执行背景音乐播放,那么用户   会注意到他们的音乐是否停止播放。

答案 1 :(得分:1)

这是因为您的设备没有足够的内存并且终止所有后台服务。尝试使用方法startForeground();

在前台模式下启动服务