2011-04-27 48 views
9

我正在开发一个应用程序,其中说5次应用程序被用户打开后,在第6次尝试应用程序应该要求用户的反馈。我尝试使用活动OnStart,OnResume,但是由于即使在离开并重新进入活动之后,这些方法也被调用,所以它没有运行。同样根据android功能,我无法退出应用程序,以便我可以从第一个活动中找到它。我如何查找应用程序启动了多少次?应用程序启动计数

我希望这不会造成混淆。

编辑

或者是有办法,其中我可以随时重新从第一个活动我的应用程序(或如欢迎页。),一旦用户按下家的退出程序。

+0

存储区每次调用oncreate/onresume时访问count并递增 – Dinash 2011-04-27 05:38:21

+3

这就是问题dinash,我不能通过Onstart/onResume来计数,这不会给我正确的计数,因为在切换活动时也会调用这些。 – 2011-04-27 05:44:04

+0

然后只在应用程序的主要活动的创建方法中增加计数 – Dinash 2011-04-27 05:49:41

回答

15

这其实很简单。使用SharedPreference或数据库。

的OnCreate过程中添加1至numberofTimes计数器和承诺。

OnCreate (Bundle bundle){ 
    mPref = getPreferences(); 
    int c = mPref.getInt("numRun",0); 
    c++; 
    mPref.edit().putInt("numRun",c).commit(); 
    //do other stuff... 
} 

不管你的OnCreate被称为启动应用程序,或者你恢复应用程序,但isFinishing()只当且仅当用户返回,如果和真实(或你)呼吁程序结束()(,它是不是由经理被破坏)

这样,你只有当你正在做新的开始递增。

isFinishing() Method内的onPause方法来检查,看看是否活动正在光洁度()或只是被暂停。

@Override 
protected void OnPause(){ 
    if(!isFinishing()){ 
    c = mPref.getInt("numRun",0); 
    c--; 
    mPref.edit().putInt("numRun",c).commit(); 
    } 
    //Other pause stuff. 
} 

这涵盖了所有的场景:

1. user starts app/activity (+1)-> finishes app, exit with finish() 
2. user starts app (+1) -> pause (-1) -> returns (+1)-> finish 
3. user starts app (+1) -> pause (-1) -> android kills process (0) -> user returns to app (+1) -> user finish. 

每一个场景,你只增加了“时间运行”计数器每次活动

+1

我认为你应该把C++放在onStart (或onResume)和c--在onStop(或onPause)中。看看活动生命周期:http://developer.android.com/reference/android/app/Activity.html – 2013-05-30 16:51:10

+0

就像@Helin Wang说的,生命周期不一样 – 2014-06-18 22:49:23

+0

另外,我相信最后一种情况是不正确的,因为你不算第一次发射。 1º“用户启动应用程序(+1) - >暂停(-1) - > android杀死进程(0)”(结果= 0),2º“用户返回到应用程序(+1) - >用户完成。 (结果= 1,就像你的第一个场景)。我为此发布了一个可能的解决方案。 – 2014-06-19 00:22:20

0

如果您只想计算“真”调用,然后扩展应用程序并将计数器逻辑放入Application#onCreate。这可能是一个简单的首选项

+0

感谢DroidIn.net。请参阅我对Sunil的回答的评论。 – 2011-04-27 06:02:55

1

如果您有启动应用程序的活动,那么您可以通过以下方式实现它: 1.数据库: - 通过数据库,您可以保存应用程序启动计数并在创建活动时检索它。

  1. 静态变量: - 在应用程序启动静态变量还保留值和结束

  2. 应用偏好: - 您可以在应用程序偏好存储值并且使用它

问题2第3种方法是,如果您关闭并再次打开手机,则会丢失数据。但如果你仍然想使用2或3的方法,然后2的方法很简单,

示例代码这里第三届方法

好你要扩展应用程序类,并创建从

public class MyApp extends Application{ 
int visitCount; 
onCreate(){ 
visitCount=0; 
} 
一个子类

,你可以提到它在你的menifest文件中像

<application name="MyApp"> 

..... 
</application> 

,并在活动的onCreate您可以通过

得到它
MyApp myApp=(MyApp)getApplicationContext(); 

EDIT1: 子类业务,且覆盖方法

public class myActivity extends Activity{ 

    @Override 
    onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     counterFlag=true; 
    } 
} 

它被调用时,用户按下home键

,并再次重写的onResume(),并检查您的计数器标志是否启用与否 和通过继承您的MyActivity

ALS创建您的所有活动o如果任何其他活动对后退按钮的点击退出点,那么你可以重写

@Override 
    public void back_pressed(){ 

    } 

,做你的任务,因此

+0

谢谢Sunil,保存计数部分是好的。但我的主要问题是我如何知道应用程序已打开。我在我的应用程序中使用Application类。但是,如果用户单击主键a [[暂停,并且当用户返回应用程序恢复时,但不会调用应用程序类的OnCreate方法。 – 2011-04-27 06:01:33

+0

那么只会调用一次,因为android并不会在家中或后面的按键上关闭应用程序。你必须使用任何启动活动onCreate方法来执行你的功能 – 2011-04-27 06:07:05

+0

Sunil,我在我的最后一个评论中提到了这个问题。当新的应用程序实例启动时,stat-up活动将被调用。在家中按键应用程序暂停,因此不会调用启动活动。该应用将从上次暂停的位置恢复。 – 2011-04-27 06:19:19

0

但是...如果问题是,你不能告诉多少次,当然你知道。我建议你采用不同的方法:例如每天询问一次用户。

行!我知道!这不是确切的解决方案,但是可能的解决方案。

+0

感谢Redax ..但这将是恼人的用户接收这样的消息,每天.. – 2011-04-28 05:59:04

1

我认为这将是最好的“运行”一次选项以覆盖所有情况:

private static boolean valueOfLaunchCountModified = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    if(!valueOfCountModified){ 
     preferences = getPreferences(MODE_PRIVATE); 
     launchCount= preferences.getInt("launchCount", 0); 
     if(preferences.edit().putInt("launchCount", ++launchCount).commit()){ 
      valueOfCountModified = true; 
      if(launchCount == 5){ 
       //Do whatever you want 
      } 
     } 
    } 
} 

如果我们记得the definition of a static variable(“..他们与班级相关,而不是与任何对象相关联。 “)我们会发现这对我们来说是完美的

当执行onPause方法或方向更改时,”valueOfLaunchCountModified“的值不会更改;但是,如果if该应用程序被破坏,的 “valueOfLaunchCountModified” 的值更改为false

2

只是,

Decalre:

​​

初始化的onCreate(...):

prefs = getPreferences(Context.MODE_PRIVATE); 
    editor = prefs.edit(); 

打印或计数任何你想要的(任何地方在的onCreate或您指定的任何具体点击)

 totalCount = prefs.getInt("counter", 0); 
    totalCount++; 
    editor.putInt("counter", totalCount); 
    editor.commit(); 

现在打印TOTALCOUNT要算例如:

 System.out.println("Total Application counter Reach to :"+totalCount);