2

我想0在用户打开我的教学应用程序时将铃声设置为,然后在用户退出时将其恢复为原始音量。这样做的最佳方法是什么?
我可以毫无问题地将音量设置为0困难
在于知道何时恢复它,我的应用程序有多个经常使用的活动,我担心将音量设置0为每个onCreate()并恢复它的性能影响onStop()似乎也杂乱和劳动密集型!
有没有人有什么建议?

作为附录,

我已经想到了一种方法来完成它的一半: 当用户为我的下一个活动打开新意图时
创建一个布尔值将其设置 为使用这个变量来检查用户是“离开”还是只是打开另一个“我的活动” 这仍然意味着我必须在我的所有s中将铃声设置为静音 有人有任何进一步的解决方案吗?leaving =true;
true
onPause()
onResume()

4

3 回答 3

2

这里的问题是您的应用程序在运行时可能并不总是位于活动堆栈的顶部。如果用户切换到另一个应用程序,或者某个警报或电话接管了焦点怎么办?

这里有一些方法可以实现你想要做的(从下面的评论中扩展):

选项1:

如果静音操作不会影响您的应用程序的性能(根据我自己的经验,我怀疑它不会),您可以使用单个抽象基类简化您在问题中建议的解决方案,重载onResume()onPause()确保您在用户返回到您已创建的活动时捕获事件:

public abstract class TeachingAppActivity extends Activity {
    public void onResume() {
        super.onResume();
        // Perform mute action here...
    }

    public void onPause() {
        super.onPause();
        // Perform unmute action here...
    }
}

public class MyActivity1 extends TeachingAppActivity {
} 

public class MyActivity2 extends TeachingAppActivity {
}

这将简化您的代码,但将操作包含在您的活动中:如果另一个应用程序抓住了焦点,铃声将被恢复。如果用户返回 MyActivity2,铃声将再次静音。

选项 2:

如果静音操作确实会影响您的应用程序的性能,或者您只是不想在每个活动的onResume()onPause()中执行它,则可以改用工作线程状态栏通知

  1. 在每个 Activity onResume() ; 启动一个 AsyncTask(或 Runnable 任务),您可以将 Activity 子类化以与您的其他活动共享此代码。
  2. 该工作线程首先检查音量,然后静音。如果音量发生变化,它会显示一个通知图标,通知用户音量已被静音。
  3. 然后,工作线程可以终止,执行此检查和操作而不影响 UI 性能。
  4. 在应用程序运行期间,音量将保持静音,如果用户跳转到另一个应用程序(或来电/消息获得焦点),他/她仍然知道音量已静音,因为通知图标仍然存在。
  5. 如果用户按下通知图标,广播意图会恢复音量。这也可能由您的应用程序中的按钮或操作触发。

如果用户在您的应用程序中按下 Home 键或反复按下 Back 键,音量将不会恢复。这是故意的,因为他们没有“退出”你的应用程序,他们只是移动到了活动堆栈的底部。规则是:只要通知图标可见,您的应用程序就已将音量静音。

这里的额外好处是,如果另一个应用程序改变了音量,您的应用程序将始终检查您的任何活动何时再次获得焦点。

于 2012-02-01T14:51:50.987 回答
0

使用功能

@Override
public void onResme() {
super.onResme();
//mute volume here
}

它将帮助您制作您想要的东西

于 2013-06-10T14:20:56.887 回答
-2

使用功能

@Override
public void onDestry() {
  super.onDestroy();
  // re-enable sound here
}

在您的主要活动中,因此您可以响应活动“退出”和“任务管理器杀死”。

于 2012-02-01T14:22:50.810 回答