我尝试实现自助服务终端模式应用程序。我能够锁定关闭应用程序或访问系统功能的大部分可能性。现在,我想知道,如果可能在锁定屏幕中有多个活动。如果我在我的应用程序的多个活动之间切换,默认锁定屏幕会显示一小段时间,然后应用程序重新出现。如果我只是替换片段,该应用就像一个魅力。
我有以下代码:
@Override
public void onAttachedToWindow() {
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onAttachedToWindow();
}
和
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
有没有人提示如何在没有闪烁的情况下改善锁定?
答案 0 :(得分:3)
好的,这就是我在键盘前面用kiosk模式解决问题的方法。
首先,我必须接受标志FLAG_SHOW_WHEN_LOCKED
不适用于多个活动。因此,我们必须将应用程序简化为单个活动。但这意味着另一个缺点:startActivity
仍将启动新活动并导致应用程序闪烁。
为避免这种情况,我重新编写了所有活动,并将其作为碎片。 MainActivity
现在可以在需要时控制替换片段。它在清单中声明为SingleTop
:
<activity android:name="com.example.DashboardActivity"
android:screenOrientation="landscape"
android:launchMode="singleTop"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.HOME"/>
</intent-filter>
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="video" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
...
</activity>
意图用以下方式处理:
@Override
public void onNewIntent(Intent intent){
super.onResume();
dispatchIntent(intent);
}
public void dispatchIntent(Intent intent) {
Log.d(TAG, "Intent:" + intent);
Bundle extras = intent.getExtras();
String action = intent.getAction();
if(extras == null) {
extras = new Bundle();
}
Fragment fragment = null;
if (Intent.ACTION_VIEW.equals(action)) {
extras.putParcelable("uri", intent.getData());
fragment = new VideoplayerFragment();
} else {
fragment = new DashboardFragment();
}
addOrReplaceFragment(fragment, extras);
}
private void addOrReplaceFragment(Fragment fragment, Bundle arguments) {
if (fragment != null && findViewById(CONTENT_CONTAINERVIEW_ID) != null) {
if(arguments != null) {
fragment.setArguments(arguments);
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
String tag = fragment.getClass().getSimpleName();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.addToBackStack(tag);
if(getFragmentManager().findFragmentByTag(fragment.getClass().getSimpleName()) != null) {
ft.replace(CONTENT_CONTAINERVIEW_ID, fragment, tag);
} else {
ft.add(CONTENT_CONTAINERVIEW_ID, fragment, tag);
}
ft.commit();
}
}
此外,如果因任何原因而停止活动,您应该注册SCREEN_ON
和SCREEN_OFF
意图来启动活动。
希望它有所帮助。