我正在制作一个android应用程序,用于测试您手机上的某些安全功能是否已启用。例如,如果您启用了密码登录,或者您的数据已在电话上加密。
出于某些原因,应用程序必须运行两次才能测试和查看手机上是否启用了这些安全功能,这就是我试图解决的问题。我希望它测试并查看安全功能是否在应用程序创建和第一次运行时启用,而不是在第二次运行时启用。
我测试是否在MainActivity文件的onStart()函数中启用了这些特性。我包含了下面的函数代码:
@Override
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressLint("NewApi")
public void onStart()
{
super.onStart();
//determine if phone uses lock pattern
//It returns 1 if pattern lock enabled and 0 if pin/password password enabled
ContentResolver cr = getBaseContext().getContentResolver();
lockPatternEnable = Settings.Secure.getInt(cr, Settings.Secure.LOCK_PATTERN_ENABLED, 0);//Settings.System
//returns 1 if pin/password protected. 0 if not
KeyguardManager keyguardManager = (KeyguardManager) getBaseContext().getSystemService(Context.KEYGUARD_SERVICE);
if( keyguardManager.isKeyguardSecure())
{
//it is pin or password protected
pinPasswordEnable=1;
}
else
{
//it is not pin or password protected
pinPasswordEnable=0;
}//http://stackoverflow.com/questions/6588969/device-password-in-android-is-existing-or-not/18716253#18716253
//determine if adb is enabled. works
adb=Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0);
//determine if bluetooth is enabled.works
bluetooth=Settings.Global.getInt(cr, Settings.Global.BLUETOOTH_ON, 0);
//Settings.System BLUETOOTH_DISCOVERABILITY
//determine if wifi is enabled. works
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled())
{
//wifi is enabled
wifiInt=1;
}
else
wifiInt=0;
//determine if data is encrypted
getDeviceEncryptionencryption();
//determine if gps enabled
}//end of onStart() function如果需要发布更多代码来回答这个问题,请让我知道,并感谢您的帮助。也许这个问题与super.onStart();有关
有没有人认为闪屏加载可能有助于解决这个问题?
发布于 2015-05-03 10:06:01
Here很好地解释了应用程序生命周期是如何流动的。可以多次执行onStart()。你可以记下你输入这个方法的次数,并且每次都会有不同的表现:
static int counter=0;
public void onStart()
{
counter++;
Log.i("MyApp", "onStart() run "+counter);
switch (counter){
case 1: break; // first run
case 2: break; // second run
default: break;// other runs
}
}为了更清楚地了解生命周期以及为什么要调用两次onStart()方法,我建议在生命周期的每个重要状态都使用counter和Log.i() -至少在onCreate()和onRestart()中是这样。
请记住,当您单击主页按钮时,应用程序会留在内存中。当您再次单击应用程序图标时,它将重新启动已经在运行的应用程序(调用onRestart(),然后调用onStart()方法,而不调用onCreate() )。当你真的杀死你的应用程序时,序列将是没有onRestart的onCreate和onStart。拥有logcat记录可以帮助您理解应用程序的生命周期流程,以及onStart()被调用两次或更多次的原因。
发布于 2015-05-08 21:12:33
使用静态变量来检查onStart被调用了多少次并不是一个好主意,因为如果Android需要更多的内存给其他应用程序,应用程序可能会被终止,同时仍然允许用户导航回应用程序。这是通过下图中红色框的路径(http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle):

在此之后,静态变量将再次为0,并且您的应用程序将再次运行安全检查。您需要做的是使用一个实例变量,该变量在onSaveInstanceState中持久化并在onCreate中恢复。如果应用程序被终止,onSaveInstanceState将被调用,您将保存活动的状态。如果用户返回到应用程序,则会调用onCreate并恢复状态。这也适用于所有其他情况,当应用程序没有被终止,但用户只是导航离开应用程序,然后重新打开它。下面是一个保存和恢复应用的简单示例:
public class MainActivity extends Activity {
private boolean mSecurityCheckDone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mSecurityCheckDone = savedInstanceState.getBoolean("mSecurityCheckDone");
}
}
@Override
protected void onStart() {
super.onStart();
if (! mSecurityCheckDone) {
// run the security check
mSecurityCheckDone = true;
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("mSecurityCheckDone", mSecurityCheckDone);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
mSecurityCheckDone = savedInstanceState.getBoolean("mSecurityCheckDone");
}
}
}发布于 2015-05-08 20:37:45
使用怎么样?
singleTop
如果活动的实例已经存在于目标任务的顶部,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。
singleTask
系统在新任务的根部创建活动,并将意图路由到该活动。但是,如果活动的实例已经存在,系统将通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新的实例。
singleInstance
与"singleTask“相同,不同之处在于系统不会在持有实例的任务中启动任何其他活动。活动始终是其任务的唯一成员。
http://developer.android.com/guide/topics/manifest/activity-element.html
https://stackoverflow.com/questions/24046132
复制相似问题