2013-04-08 46 views
1

我面临的问题找到如何调用用户定义的方法启动(否则,只需登录一个消息)时,应用程序变得活跃是来自于背景,即前台,如果用户按下home键当应用程序再次到达前台时,该应用程序会转到后台我想显示一个警告框。可以请某些人告诉我如何执行此检查,以了解应用程序是否已到达前台或提供某些链接。我不明白要搜索什么对于。有些网站提到我可以覆盖OnResume()。然而,即使我回到这个活动,每当我的活动从一个活动启动到另一个时,都会调用此方法。我只需要在用户从背景到前景时才调用此方法。如何识别活动从背景

回答

2

这是一个简单的解决方案。

@Override 
    protected void onPause() 
    { 
     super.onPause(); 

     PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     isScreenOn = powerManager.isScreenOn(); 
     OnPause = true; 

    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     OnResume = true;  
     if (!isScreenOn) 
      { 
       // your code; 
      } 
    } 

    @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
     super.onStop(); 

     if(OnPause == true && OnResume == true && !isScreenOn) 
     { 
      YourActivity.this.finish(); 
     } 
     isScreenOn = false; 
     OnPause = false; 
     OnResume = false; 
    } 

这里isScreenOn,在onPause,是的onResume布尔值。 当你的手机屏幕得到锁定,那么应用程序进去的onPause(),它检查“isScreenON”,然后变为“的onStop()”,其中isScreenOn设置为false。

当你的活动都在前台“的onResume”之称。它检查isScreenON,它绝对完美。直到他进入password.This应用程序将仅适用于单个用户(设备ID特定的)使用.Couldü请告诉我如何写一个方法/(该法)

+0

我想你的代码,我已经在这里添加了一个吐司消息(//你的代码;)然而,当我第一次启动到活动即使再敬酒消息是executed.This吐司应该,如果我只执行从背景到前景 – Joyson 2013-04-17 10:17:56

+0

boolean isScreenOn = true; public static boolean OnPause = false; public static boolean OnResume = false; 为您的活动中的变量设置这些默认值。 – 2013-04-17 12:18:00

+0

嘿萨加尔日Thnx一吨这个作品很酷!但是我想实现这个多activities.Do我需要在所有类别中写这个逻辑,我想使它这样的全球性,每当我去后台而来前景应该调用我的代码的任何活动。 – Joyson 2013-04-19 09:41:15

0

我会建议使用超时密码。因此,当用户使用该应用程序时,密码将在x分钟内保持“正常”。

试想一下,如果有人在早上推出的应用程序,可以追溯到homemenu,并在您仍想先登录用户晚上再启动它?

超时日期可以很容易地存储在SharedPreferences。 (也请不要将密码存储在SharedPreferences纯文本,但保存它的哈希值。

+0

是@ Rcdk.The用户不能使用该应用程序如果您有解决方案,请确定该应用已进入活动状态。 – Joyson 2013-04-08 09:32:39

1

解决方法很简单

考虑四种方法的onCreate()的onResume,在onPause()的onSaveInstanceState(捆绑outState)。

你需要创建一个长的全局变量为这项活动

现在目前的时间分配电流,这个变量中的onCreate(),如果你的Bundle savedInstanceState为null,其他明智的savedInstanceState

还原值

在的onResume检查当前时间之间的差异millsec System.currentTimeMillis();和这个全局变量,如果是大于说1秒(可根据您的需求会更高)显示一个警告框询问密码

在的onPause()将System.currentTimeMillis();保存为全局变量。

onSaveInstanceState(Bundle outState)存储全局变量的值捆绑在的onCreate恢复()。

示例代码

 import android.os.Bundle; 
     import android.widget.Toast; 
     import android.app.Activity; 


     public class MainActivity extends Activity { 

     long timeLastPause=0; 

      @Override 

      public void onCreate(Bundle savedInstanceState) 
      { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 


       if(savedInstanceState==null) 
       { 
        timeLastPause=System.currentTimeMillis(); 
//Toast.makeText(this, "App created just now", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        timeLastPause= savedInstanceState.getLong("timeLastPause"); 

       } 





      } 

      @Override 
       protected void onResume() { 
        // TODO Auto-generated method stub 
        super.onResume(); 
        if((System.currentTimeMillis()-timeLastPause)>1000) 
        { 
         Toast.makeText(this, "the app becomes active that is comes to foreground from background", Toast.LENGTH_LONG).show(); 
        } 
       } 


      @Override 
       protected void onPause() { 
        // TODO Auto-generated method stub 
        super.onPause(); 
        timeLastPause=System.currentTimeMillis(); 

       } 


      @Override 
      protected void onSaveInstanceState(Bundle outState) { 
       // TODO Auto-generated method stub 
       super.onSaveInstanceState(outState); 
       outState.putLong("timeLastPause", timeLastPause); 
      } 


      } 

[编辑]

现在好了任意数量的活动[:-0这是棘手的,希望它会工作。我在一些项目中实现这一点,工作得很好]

清单中

<application 
     android:name=".TrickyApplication" 
     ... 
      > 

现在,在每一个活动onResume()

TrickyApplication app = ((TrickyApplication) this.getApplication()); 

if (System.currentTimeMillis() - app.lastPause > 1000) { 
    Toast.makeText(this, "Show Password Dlg Now", Toast.LENGTH_LONG).show(); 
      } 

创建TrickyApplication.java

public class TrickyApplication extends Application { 
    public long lastPause; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     lastPause = 0; 
    } 
} 

现在在每一个活动onPause()

((TrickyApplication) this.getApplication()).lastPause = System 
       .currentTimeMillis(); 

注意,密码对话框会也显示,第一次可以用一些共享偏好管理这一点,并没有设置它,直到你的用户不显示对话框

之前设置一个密码左右,然后再检查县
+0

我猜密码部分是混淆了我的问题,所以我编辑的question.Please检查 – Joyson 2013-04-08 09:57:34

+0

查看示例代码我只是说 – 2013-04-08 10:12:10

+0

一个简单的布尔也就够了,你在OnCreate设置(这将只调用一次)。无需存储时间等。 – RvdK 2013-04-08 10:22:58