应用从最近的应用列表中刷出后处理耳机断开连接
handle headset disconnected after app is swiped out of the recent apps list
我有一个服务可以处理手机连接并在媒体播放器断开连接时暂停它
这是代码
private static int headsetSwitch = 1;
public static boolean headsetconnected = false;
public BroadcastReceiver headsetReciever = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent
.getAction())) {
// Pause the playback
mediaPlayer.pause();
}
if (intent.hasExtra("state")) {
if (headsetconnected && intent.getIntExtra("state", 0) == 0) {
headsetconnected = false;
Toast.makeText(getApplicationContext(),
"headsetconnected = false", Toast.LENGTH_SHORT)
.show();
headsetSwitch = 0;
}
else if (!headsetconnected
&& intent.getIntExtra("state", 0) == 1) {
headsetconnected = true;
Toast.makeText(getApplicationContext(),
"headsetconnected = true", Toast.LENGTH_SHORT)
.show();
headsetSwitch = 1;
// Lockscreencontrol();
}
}
switch (headsetSwitch) {
case (0):
headsetDisconnected();
break;
case (1):
break;
}
}
};
private void headsetDisconnected() {
try {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
if (PlayerActivity.play != null) {
PlayerActivity.play
.setImageResource(R.drawable.ic_play_arrow_white_36dp);
}
if (MainActivity.play != null) {
MainActivity.play
.setImageResource(R.drawable.ic_play_arrow_white_24dp);
}
if (getallsongs.play != null) {
getallsongs.play
.setImageResource(R.drawable.ic_play_arrow_white_24dp);
}
}
} catch (Exception e) {
}
}
如果应用程序最小化且服务为 运行
,则此代码运行良好
如果我们将应用从最近的应用列表中滑开,就会出现问题
现在指的是这个
答案是 Don't ever swipe apps
但这不是用户的一般行为
该应用程序会崩溃并尝试重新启动服务并再次崩溃
我的问题是
我们如何管理这个既不被
处理的特定生命周期事件
ondestroy
在 onpause
我们如何管理在后台获得服务 运行 并且该应用已从最近的应用列表中删除的应用
我见过在发生上述事件后悄悄关闭应用程序的应用程序
我们如何才能在不崩溃的情况下停止应用程序。
我什至尝试过使用
刷出应用程序时管理 unregister listeners
<service
android:name="com.musicplayer.mp3player.PlayService"
android:enabled="true"
android:stopWithTask="false"
android:label="Audio-playback service" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
然后
public void onTaskRemoved(Intent rootIntent) {
// unregister listeners
// do any other cleanup if required
try {
unregisterReceiver(headsetReciever);
} catch (Exception e) {
// TODO: handle exception
}
// stop service stopSelf();
}
在 ondestroy
中调用 stopForeground(true);
是否会导致这样的问题。
请对您可能提供的答案进行解释,谢谢。
经过大量搜索得出这个结论
onstartcommand
中的服务有 START_STICKY
因此每当服务停止时它将重新启动,除非 stopService() or stopSelf()
被调用
我的服务需要一些 getintentextras
在服务重新启动时找不到
因此进行了检查
if (intent == null) {
stopSelf();
return START_NOT_STICKY;
}
START_NOT_STICKY
不会再次启动服务,因此不会发生错误
这不是正确的方法,但这是 android 本身的问题。
我有一个服务可以处理手机连接并在媒体播放器断开连接时暂停它
这是代码
private static int headsetSwitch = 1;
public static boolean headsetconnected = false;
public BroadcastReceiver headsetReciever = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent
.getAction())) {
// Pause the playback
mediaPlayer.pause();
}
if (intent.hasExtra("state")) {
if (headsetconnected && intent.getIntExtra("state", 0) == 0) {
headsetconnected = false;
Toast.makeText(getApplicationContext(),
"headsetconnected = false", Toast.LENGTH_SHORT)
.show();
headsetSwitch = 0;
}
else if (!headsetconnected
&& intent.getIntExtra("state", 0) == 1) {
headsetconnected = true;
Toast.makeText(getApplicationContext(),
"headsetconnected = true", Toast.LENGTH_SHORT)
.show();
headsetSwitch = 1;
// Lockscreencontrol();
}
}
switch (headsetSwitch) {
case (0):
headsetDisconnected();
break;
case (1):
break;
}
}
};
private void headsetDisconnected() {
try {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
if (PlayerActivity.play != null) {
PlayerActivity.play
.setImageResource(R.drawable.ic_play_arrow_white_36dp);
}
if (MainActivity.play != null) {
MainActivity.play
.setImageResource(R.drawable.ic_play_arrow_white_24dp);
}
if (getallsongs.play != null) {
getallsongs.play
.setImageResource(R.drawable.ic_play_arrow_white_24dp);
}
}
} catch (Exception e) {
}
}
如果应用程序最小化且服务为 运行
,则此代码运行良好如果我们将应用从最近的应用列表中滑开,就会出现问题
现在指的是这个
答案是 Don't ever swipe apps
但这不是用户的一般行为
该应用程序会崩溃并尝试重新启动服务并再次崩溃
我的问题是
我们如何管理这个既不被
处理的特定生命周期事件ondestroy
在 onpause
我们如何管理在后台获得服务 运行 并且该应用已从最近的应用列表中删除的应用
我见过在发生上述事件后悄悄关闭应用程序的应用程序
我们如何才能在不崩溃的情况下停止应用程序。
我什至尝试过使用
刷出应用程序时管理unregister listeners
<service
android:name="com.musicplayer.mp3player.PlayService"
android:enabled="true"
android:stopWithTask="false"
android:label="Audio-playback service" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
然后
public void onTaskRemoved(Intent rootIntent) {
// unregister listeners
// do any other cleanup if required
try {
unregisterReceiver(headsetReciever);
} catch (Exception e) {
// TODO: handle exception
}
// stop service stopSelf();
}
在 ondestroy
中调用 stopForeground(true);
是否会导致这样的问题。
请对您可能提供的答案进行解释,谢谢。
经过大量搜索得出这个结论
onstartcommand
中的服务有 START_STICKY
因此每当服务停止时它将重新启动,除非 stopService() or stopSelf()
被调用
我的服务需要一些 getintentextras
在服务重新启动时找不到
因此进行了检查
if (intent == null) {
stopSelf();
return START_NOT_STICKY;
}
START_NOT_STICKY
不会再次启动服务,因此不会发生错误
这不是正确的方法,但这是 android 本身的问题。