1

如果 Screen Lock 设置为 None ,我在 ViewFlipper 上发现相同的问题不会重新开始翻转

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

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

4

2 回答 2

7

你可以试试这个,它应该工作:

  • 删除活动中的每个 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);)

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

如果可行,请不要忘记清理代码;)

private static final int DELAY_MSG = 42;
private static final int DELAY = 3000;
于 2013-12-17T14:25:59.910 回答
1

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

于 2014-05-28T11:38:30.160 回答