我正在开发一个简单的应用程序,它只是在后台播放声音,直到被用户杀死。问题是,当我在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"/>
那么,问题是什么?
答案 0 :(得分:2)
对于API级别5或更高版本,您可以使用startForeground()方法在前台启动服务。
该文件说
使此服务在前台运行,提供正在进行的服务 在此状态下向用户显示通知。默认情况下 服务是后台的,这意味着如果系统需要杀死它们 回收更多内存(例如在网络中显示大页面) 浏览器),他们可以在没有太大伤害的情况下被杀死。你可以设置它 如果查杀您的服务会对用户造成破坏,例如 如果您的服务正在执行背景音乐播放,那么用户 会注意到他们的音乐是否停止播放。
答案 1 :(得分:1)
这是因为您的设备没有足够的内存并且终止所有后台服务。尝试使用方法startForeground();
在前台模式下启动服务