2017-08-01 84 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); 
} 

這是方式,但由於安全鎖定(打開您的設備),我認爲,它無法執行。

相關問題