我有一个BaseActivity,它被其他所有活动扩展。问题是,每当用户离开(onPause)活动时,我都会将音乐静音。我也不再听电话了。 问题是,只要用户在活动之间切换,就会调用onPause
,这意味着应用会不必要地静音并停止telephonymanager
,即使它只是静音和停止telephonymanager
如果用户要离开应用程序。
@Override
protected void onPause() {
Log.v(TAG, "IN onPause!");
// unregister phone listener to telephony manager
tManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
mute();
super.onPause();
}
现在说我在public class myClass extends BaseActivity
之间切换并切换到public class myOtherClass extends BaseActivity
。此切换不必要地执行onPause
,即使我只希望在用户离开应用时将onPause
称为 。我该怎么办?
感谢专家的建议,
富
答案 0 :(得分:1)
根据我的理解,你在onPause of BaseActivity中播放你的音乐,而不是把它写在你的音乐播放活动中
前:
public class BaseActivity extends AppCompatActivity{
@Override
public void onPause(){
//do things that common for all activities
}
}
public void MusicPlayActivity extends AppCompatActivity{
@Override
public void onPause(){
music.mute()
}
}
这将有效
<强>更新强>
有几种方法可以检测您的应用程序是否在后台运行,但只有一种方法是完全可靠的:
使用Activity.onPause
,Activity.onResume
方法自行跟踪应用程序的可见性。存储&#34;可见性&#34;在其他一些班级中的地位。
<强> 实施例 强> :实现自定义Application类(注意isActivityVisible()静态方法):
公共类MyApplication扩展了Application {
public static boolean isActivityVisible() {
return activityVisible;
}
public static void activityResumed() {
activityVisible = true;
}
public static void activityPaused() {
activityVisible = false;
}
private static boolean activityVisible;
}
在AndroidManifest.xml中注册您的应用程序类:
<application
android:name="your.app.package.MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name" >
将onPause
和onResume
添加到项目中的每个活动中(如果您愿意,可以为您的活动创建一个共同的祖先,但如果您的活动已经从MapActivity /扩展) ListActivity等你还需要手工编写以下内容:
@Override
protected void onResume() {
super.onResume();
MyApplication.activityResumed();
}
@Override
protected void onPause() {
super.onPause();
MyApplication.activityPaused();
}
在API级别14(Android 4.0)中添加了ActivityLifecycleCallbacks。您可以使用它们来跟踪用户当前是否可以看到您的应用程序的活动。请查看下面的Cornstalks' answer了解详细信息。
答案 1 :(得分:0)
根据您的评论,您只想在应用程序的最后Activity
退出时停止播放音乐。覆盖BaseActivity
这样的finish()
方法就可以实现您的目标:
@Override
public void finish() {
super.finish();
if (isTaskRoot()) {
// This is the last Activity in the stack so mute your music here...
}
}
实际上你可能想要onDestroy()
或onStop()
因为我不确定finish()
会执行,除非你打电话给它但想法是一样的:
@Override
protected void onDestroy() {
super.onDestroy();
if (isTaskRoot()) {
// This is the last Activity in the stack so mute your music here...
}
}
此处有isTaskRoot()
的信息:
返回此活动是否为任务的根。根是任务中的第一个活动。
<强>返回强>
如果这是根活动,则为True,否则为false。