java - 在媒体播放器上实现后台服务
问题描述
我正在尝试在运行网络广播的媒体播放器上实现后台服务。但我是使用 java/Android 编程的初学者,我无法实现我作为示例看到的代码。
这是我的 MainActivity.java:
public class MainActivity extends AppCompatActivity {
Button button_play;
boolean prepared = false;
boolean started = false;
String Stream = "UrlFromWebRadio";
// in my case i use http://wz5.dnip.com.br/litoral/litoral.stream/playlist.m3u8
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_play = findViewById(R.id.button_play);
button_play.setEnabled(false);
button_play.setText("Loading");
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
new PlayerTask().execute(Stream);
button_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(started){
started = false;
mediaPlayer.pause();
button_play.setText("Play");
}
else{
started = true;
mediaPlayer.start();
button_play.setText("Stop");
}
}
});
}
class PlayerTask extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... strings){
try{
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.prepare();
prepared = true;
}
catch (IOException e){
e.printStackTrace();
}
return prepared;
}
@Override
protected void onPostExecute(Boolean aBoolean){
super.onPostExecute(aBoolean);
button_play.setEnabled(true);
button_play.setText("Play");
}
}
@Override
protected void onPause(){
super.onPause();
if(started){
mediaPlayer.pause();
}
}
@Override
protected void onResume() {
super.onResume();
if(started){
mediaPlayer.start();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(prepared){
mediaPlayer.release();
}
}
}
这是我的服务示例类(WebRadioService.java):
public class WebRadioService extends Service{
MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
//
// mediaPlayer = MediaPlayer.create(this, R.drawable.test);
// the line above will play specific file
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
mediaPlayer.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Finalized", Toast.LENGTH_SHORT).show();
mediaPlayer.release();
}
}
这就是我目前拥有我的代码的方式,并且 MainActivity 可以工作。现在想实现后台服务。但是我不能用我现在看到的例子,可能是因为缺乏知识。有人可以帮忙吗?
解决方案
你必须使用一种叫做 Android 服务的东西。
从文档:
“服务是一个应用程序组件,代表应用程序希望在不与用户交互的情况下执行更长时间运行的操作,或者为其他应用程序提供功能使用。”
START_STICKY
如果系统在 onStartCommand() 返回后终止服务,则重新创建服务并调用 onStartCommand(),但不要重新传递最后一个意图。相反,系统会以空意图调用 onStartCommand() ,除非有待启动的意图来启动服务。在这种情况下,这些意图就会被传递。这适用于不执行命令但无限期运行并等待作业的媒体播放器(或类似服务)。
推荐阅读
- c - 使用 FFI 和 C 函数在 ruby 中创建动态数组类
- javascript - 有没有办法在 where: $or 子句中包含一个数组和 sequelize?
- java - Android Studio中基于Button发送数据
- database - 如何在数据库laravel中存储不同用户角色的用户元信息
- angular - 带有函数调用的Angular 7动态列
- apache-spark - 使用简单查询时,如何在 Hive-Spark 中修复“org.apache.hadoop.hive.ql.metadata.HiveException”?
- python - 使用 Pandas pivot_table 嵌套小计“所有”行
- python - 二叉树的高度 - 迭代
- c - 使用 bazel 制作共享对象时不能使用全局
- java - 如何使环境变量在 JAR 文件中工作?