2017-08-01 81 views
0

我有一个应用程序,其安全性我想提高。当用户解锁设备时,我希望应用程序返回到登录屏幕,以便入侵者不能通过解锁设备并让应用程序恢复其原始状态来使用应用程序。当用户关闭屏幕时开始活动?

我正在使用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

https://stackoverflow.com/questions/8317331/detecting-when-screen-is-locked – litelite

+0

它这样做是因为您正在启动主要活动,而不管屏幕关闭时发生了什么。您没有逻辑来区分刚刚使用该应用程序的用户。 –

回答

1

当用户点击home键,在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中一个空白的项目和尝试。有用! :)

如果我们点击进入另一项活动并深入应用程序会发生什么?

在Private类中创建一个布尔值。

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)); 
     } 

    } 
} 
+0

感谢您的回答,但onPause()也会在您开始一个新活动时调用,所以肯定通过重写我会将用户返回到主活动,每次他们开始一个新活动? – BoshJailey

+0

好吧,你在你不希望用户留在的活动中重写它,对吧?所以如果你重写的是在Privacy.java中......只要我点击主页按钮,应用程序会自动将我发回MainActivity.java。由于我在MainActivity内部,所以当我再次加载应用程序时,它会到达那里。为什么?因为我没有压倒在那里......只有在隐私课上。 – DroiDev

+0

对不起,我为了理解你的评论而苦苦挣扎。好吧,说这个用户在Privacy.java中,他们也可以从那个开始一个新的活动,这会让他们更深入到应用程序中。即,如果你明白我的意思,Privacy.java并不是应用程序最深的一点。我以前的观点仍然存在吗? – BoshJailey

0

我不认为这实际上是你想要的。如果他们有锁屏,他们必须输入密码。你可以相当确定它是合适的人。如果您想要这种行为,您希望因不活动而超时会话。

无论哪种方式,解决方案是相同的。在onResume中,您应该检查是否超时/进入锁定屏幕。如果是这样,请启动登录屏幕作为新任务(这将阻止后退按钮将您带回此屏幕)并完成()当前活动。传递登录屏幕一些信息,以便重新创建当前活动。当用户被验证时,检查该信息并从中创建适当的活动。如果信息不存在,请启动您的标准主屏幕。

传递足够的信息来创建新Activity的最简单方法是将它传递给一个Bundle,其中包含活动名称或url以及调用onSaveInstanceState的结果。

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()回调,因此,你必须把里面的onStop上面的代码()你的Activity生命周期回调。像下面的东西。

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    boolean isScreenOn = pm.isScreenOff(); 
if(isScreenOn) { 
sendBroadcast(<your_screenOff_intent); 
} 

这是方式,但由于安全锁定(打开您的设备),我认为,它无法执行。

相关问题