【问题标题】:ViewFlipper does not restart flipping if Screen Lock is set to None如果屏幕锁定设置为无,ViewFlipper 不会重新开始翻转
【发布时间】:2013-10-21 07:45:30
【问题描述】:

我在ViewFlipper does not restart flipping if Screen Lock is set to None发现了同样的问题:

ViewFlipper 小部件的一个很酷的功能是它会在屏幕关闭时自动停止翻转,如果继续则重新开始翻转。

很遗憾,如果未设置屏幕锁定(设置 > 安全 > 屏幕锁定 > 无),则 Intent.ACTION_USER_PRESENT 永远不会广播到系统,并且 ViewFlipper 永远无法重新启动。

可能的修复方法是:

a) 在 ACTION_SCREEN_ON 而不是 ACTION_USER_PRESENT 上重新启动 ViewFlipper 翻转。 b) 如果没有设置屏幕锁定并且屏幕继续,则广播 ACTION_USER_PRESENT。

重现错误的步骤:

  • 在系统设置中将屏幕锁定设置为无。
  • 使用 ViewFlipper 启动应用程序。
  • 关闭屏幕(快速按下电源)
  • 开启屏幕(快速按下电源)

结果:ViewFlipper 不再有动画效果

Expected result: the ViewFlipper must be animated again.

看来这个问题还没有解决。我想在我自己的应用程序中修复它。有什么办法吗?

我试图解决它。我在我的代码中发送了广播公司Intent.ACTION_SCREEN_ON。但它抛出异常:

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.USER_PRESENT from pid=XXX, uid=XXX

然后我检查了源代码,发现这些广播器仅供系统使用。失败。

【问题讨论】:

    标签: android


    【解决方案1】:

    你可以试试这个,应该可以的:

    • 删除活动中的每个 startFlipping() 或 stopFlipping() 或 setAutoStart() 或 setFlipInterval()。

    • 现在将其添加到您的活动中:

    代码:

    private boolean isStarted = false;
    
    private void runFlipper() {
        if (isStarted == false) {
            Message msg = mHandler.obtainMessage(42);
            mHandler.sendMessageDelayed(msg, 3000);
            isStarted = true;
        }
    }
    
    private void stopFlipper() {
        mHandler.removeMessages(42);
        isStarted = false;
    }
    
    @SuppressLint("HandlerLeak")
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 42) {
                Log.d("ImageFlipper", "Next picture...");
                viewFlipper.showNext();
                msg = obtainMessage(42);
                sendMessageDelayed(msg, 3000);
            }
        }
    };
    

    ("viewFlipper" 是 viewFlipper = (ViewFlipper) this.findViewById(R.id.view_flipper);)

    • 在 Activity 的 onResume() 中,调用 runFlipper()。
    • 在 Activity 的 onPause() 中,调用 stopFlipper()。

    如果有效,别忘了清理代码;)

    private static final int DELAY_MSG = 42;
    private static final int DELAY = 3000;
    

    【讨论】:

    • 这就像一个魅力。感谢您的回答。我更希望 API 做它应该做的事情,但在 Android 中,如果我们想要完成应用程序,有时我们必须挥动白旗并编写一个不错的 hack。
    【解决方案2】:

    如果屏幕锁定设置为无,ViewFlipper 不会重新开始翻转。这个问题需要通过android框架来解决。

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多