我有一个应用程序,其安全性我想改进。当用户解锁设备时,我希望应用程序返回到登录屏幕,以便入侵者只需通过解锁设备并让应用程序恢复其原始状态即可使用该应用程序。
我正在使用BroadcastReceiver来检测何时按下电源按钮,但这会导致登录屏幕被加载,无论用户是否在按下电源按钮之前使用该应用程序。
下面我已经包含了我的BroadcastReceiver代码,如果有可能,有人可能会对这个问题有所了解吗?
public class ScreenReceiver extends BroadcastReceiver {
public static boolean wasScreenOn = true;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Intent n = new Intent(context, MainActivity.class);
context.startActivity(n);
wasScreenOn = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
wasScreenOn = true;
}
}
}
答案 0 :(得分:2)
当用户点击主页按钮时,会调用onPause()和onStop()。当他们点击后退按钮(退出应用程序)时,会调用onPause(),onStop()和onDestory()。最后,当他们按下电源按钮时,会调用onPause()和onStop()。
他们都首先调用onPause()。覆盖onPause()并使用intent返回主活动。您还可以清除一堆活动,这样他们就无法点击后退按钮返回一个。
<强> MainActivity 强>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button goPrivate = (Button) findViewById(R.id.goPrivate);
goPrivate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Private.class));
}
});
}
}
<强> activity_main.xml中 强>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.vzw.www.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MAIN"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="GO TO PRIVATE"
android:id="@+id/goPrivate"/>
</RelativeLayout>
创建新活动。我将我的名字命名为Private.java
<强> Private.java 强>
public class Private extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_private);
}
@Override
protected void onPause() {
super.onPause();
startActivity(new Intent(Private.this, MainActivity.class));
}
}
<强> activity_private.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.vzw.www.myapplication.Private"
android:layout_gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PRIVATE!"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
只需在Android Studio中创建一个空白项目即可试用。有用! :)
如果我们点击其他活动并深入了解应用程序会发生什么?
在私有类中创建一个布尔值。
boolean goSuperClicked = false;
更新后的私人课程如下:
public class Private extends AppCompatActivity {
Button goSuper;
boolean goSuperClicked = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_private);
goSuper = (Button) findViewById(R.id.goSuper);
goSuper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
goSuperClicked = true;
startActivity(new Intent(Private.this, SuperPrivate.class));
}
});
}
@Override
protected void onPause() {
super.onPause();
Log.d("onPause()", "onPause called");
if (!goSuperClicked) {
startActivity(new Intent(Private.this, MainActivity.class));
}
}
}
答案 1 :(得分:0)
我认为这实际上并不是你想要的。如果他们有锁屏,他们必须在上面输入密码。你可以相当肯定它是合适的人选。如果您想要这种行为,则希望由于不活动而使会话超时。
无论哪种方式,解决方案都是一样的。在onResume中,您应该检查他们是否超时/进入锁定屏幕。如果是这样,请将登录屏幕作为新任务启动(这将阻止后退按钮将您带回此屏幕)并完成()当前活动。通过登录屏幕一些信息,以便它可以重新创建当前活动。验证用户后,检查该信息并从中创建适当的活动。如果信息不存在,请启动标准主屏幕。
传递足够信息以创建新Activity的最简单方法是将其传递给包含活动名称或url的Bundle,以及调用onSaveInstanceState的结果。
答案 2 :(得分:0)
一些建议:
1)设置检测屏幕开/关意图的广播接收器。
Intent.ACTION_SCREEN_OFF and ACTION_SCREEN_ON
2)实施广播接收器,当匹配屏幕关闭时启动活动。
3)通过PowerManager
关闭并打开屏幕PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
4)因为onStop()回调发生屏幕关闭,所以你必须将上面的代码放在Activity生命周期的onStop()回调中。像下面的东西。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOff();
if(isScreenOn) {
sendBroadcast(<your_screenOff_intent);
}
这就是方法,但由于安全锁定(打开你的设备),我认为它无法实现。