6

我正在开发一个 android 应用程序,我想知道它被打开了多少次。有没有办法做到这一点?

4

8 回答 8

9

onCreate在 an中使用的问题Activity是,即使方向发生变化,这也会增加计数器。使用onCreatein anApplication也有一个缺点,即您的计数器只会在 VM 关闭后才会增加 - 所以即使应用程序退出并重新打开,它也不一定会增加。

事实是没有万无一失的方法来处理这种计数,但是我想出了一个非常好的方法,它尽可能接近 100% 准确。它需要在一个Application类和你的主Activity类中工作,并且依赖于时间戳来区分方向变化和实际的应用程序启动。首先,添加以下Application类:

/**
 * Application class used for correctly counting the number of times an app has been opened.
 * @author Phil Brown
 * @see <a href="http://stackoverflow.com/a/22228198/763080">Stack Overflow</a>
 *
 */
public class CounterApplication extends Application
{
    private long lastConfigChange;

    /** @param buffer the number of milliseconds required after an orientation change to still be considered the same event*/
    public boolean wasLastConfigChangeRecent(int buffer)
    {
        return (new Date().getTime() - lastConfigChange <= buffer);
    }

    @Override
    public void onCreate()
    {
        lastConfigChange = new Date().getTime();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        lastConfigChange = new Date().getTime();
    }
}

您应该AndroidManifest.xml通过指定 name 应用程序属性将此应用程序添加到您的应用程序中:

android:name="path.to.CounterApplication"

现在,在您的 mainActivity中,添加以下内容onCreate

//note that you can use getPreferences(MODE_PRIVATE), but this is easier to use from Fragments.
SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE);

int appOpenedCount = prefs.getInt("app_opened_count", 1);
if (!((CounterApplication) getApplication()).wasLastConfigChangeRecent(10000))//within 10 seconds - a huge buffer
{
    appOpenedCount += 1;
    prefs.edit().putInt("app_opened_count", appOpenedCount).commit();
}

//now say you want to do something every 10th time they open the app:
boolean shouldDoThing = (appOpenedCount % 10 == 0);
if (shouldDoThing)
{
    doThing();
    appOpenedCount += 1;
    //this ensures that the thing does not happen again on an orientation change.
    prefs.edit().putInt("app_opened_count", appOpenedCount).commit();
}
于 2014-03-06T15:02:13.970 回答
8

只是,声明:

    private SharedPreferences prefs;
    private SharedPreferences.Editor editor;
    private int totalCount;

在 onCreate(...) 中初始化:

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

随心所欲地打印或计数(onCreate 中的任何位置或您指定的任何特定点击)

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

现在打印要计算的总计数,例如:

     System.out.println("Total Application counter Reach to :"+totalCount);
于 2014-07-30T09:17:38.403 回答
6

在您的应用程序或活动的方法中,递增存储在持久存储onCreate()中的计数器,例如.SharedPreferences

于 2012-08-23T13:46:31.820 回答
4

您可以使用共享首选项。每次打开应用程序时,检索首选项,增加计数,然后立即存储。唯一的问题是,如果用户删除了应用程序以及所有偏好,那么计数也将被删除。这是一个承诺偏好的示例。用于getPreferences在应用程序启动时检索它们。

SharedPreferences prefs=getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor=prefs.edit();
editor.putString("pref 1", "some text");

editor.commit();
于 2012-08-23T13:49:13.300 回答
2

单程:

将属性保持preferences在启动activity更新首选项计数为“1”,但您可能无法看到此增加的值,因为它保留在手机上。

另一种方式

向您的服务器调用服务(如果有)以增加访问次数。

于 2012-08-23T13:47:01.427 回答
2

1.对于一个简单的方法,text file在读取值后保留一个将值增加 1 的位置。保持OnCreate()Activity 方法的计数增量

2.你可以使用SharedPreference.

3. WellDataBase也可以用……不过我觉得这个太杀了……

于 2012-08-23T13:51:34.483 回答
0
  Using SharedPreference or the Database.

during OnCreate add 1 to the numberofTimes counter and commit.

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

OnCreate is called regardless of you start the app or you resume the app, but isFinishing() returns true if and only iff the user (or you) called finish() on the app (and it was not being destroyed by the manager)

This way you only increment when you are doing fresh start.

the onFinishing() Method inside of a OnPause method to check to see if the activity is being finish() or just being paused.

@Override
protected void OnPause(){
  if(!onFinishing()){
    c = mPref.getInt("numRun",0);
    c--;
    mPref.edit().putInt("numRun",c).commit();
  }
  //Other pause stuff.
}
于 2014-01-07T05:41:50.840 回答
0

正如我在另一个答案中所说,我认为以下是最好的解决方案:

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 && valueOfCountModified){
        //Do whatever you want
    }
}

如果我们记得静态变量的定义,我们会发现它对我们来说是完美的:

它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量。

onPause执行方法或方向更改时, 的值valueOfLaunchCountModified不会改变;但是,如果应用程序进程被破坏,则该值valueOfLaunchCountModified将更改为 false。


于 2014-06-18T21:59:25.487 回答