我正在学习Android服务。我的主要活动中有一个按钮,当单击时,使用媒体播放器开始播放声音文件,并显示通知。我希望停止音乐服务,并在点击通知时删除通知。由于我无法弄清楚我做错了什么,我现在已经把头撞在墙上几个小时了。这是我的服务类:
public class MusicService extends Service {
public MusicService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
player.setLooping(true);
player.start();
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Hello")
.setTicker("Hello 2")
.setContentText("Hello 3")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(pendingIntent)
.setOngoing(true)
.build();
startForeground(NOTIFICATION_ID.FOREGROUND_SERVICE, notification);
return START_STICKY;
}
public interface NOTIFICATION_ID {
public static int FOREGROUND_SERVICE = 101;
}
}
答案 0 :(得分:2)
通过将待处理意图传递给广播来停止前台服务和打开点击通知活动有什么问题:
创建广播接收器
public class MusicNotificationBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Start Activity
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activityIntent);
// Start Services
startService(new Intent(this, MusicService.class).setAction("STOP_ACTION"));
}
}
发出通知:
Intent intent = new Intent(context, MusicNotificationBroadcastReceiver.class);
PendingIntent contentIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Hello")
.setTicker("Hello 2")
.setContentText("Hello 3")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(contentIntent)
.setOngoing(true)
.build();
所以在 onStartCommand 处理这个:
if(intent.getAction() != null && intent.getAction().equals("STOP_ACTION")) {
stopForeground(true);
}