应用启动计数

时间:2011-04-27 05:34:41

标签: android

我正在开发一个应用程序,其中在用户打开应用程序5次之后,在第6次尝试时应用程序应该询问用户的反馈。我尝试使用活动OnStartOnResume,但由于即使离开并重新进入活动后这些方法也被调用,因此无法解决问题。此外,根据Android功能,我不能退出应用程序,以便我可以从第一个被调用的活动中找到它。如何找到应用程序启动的次数?

我希望这不会令人困惑。

修改

或者有一种方法,一旦用户按下主页退出应用程序,我总是可以从第一个活动(或例如,欢迎页面)恢复我的应用程序。

6 个答案:

答案 0 :(得分:16)

这实际上非常简单。使用SharedPreference或数据库。

在OnCreate期间

将numberofTimes计数器添加1并提交。

OnCreate (Bundle bundle){
  mPref = getPreferences();
  int c = mPref.getInt("numRun",0);
  c++;
  mPref.edit().putInt("numRun",c).commit();
  //do other stuff...
}
无论您启动应用程序还是恢复应用程序,都会调用OnCreate,但isFinishing()返回true,当且仅当用户(或您)在应用程序上调用finish()时(并且它没有被销毁)管理器)

这样你只有在重新开始时才会增加。

OnPause方法中的isFinishing() Method,用于检查活动是完成()还是暂停。

@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 :(得分:4)

只需:

  1. 声明:

    private SharedPreferences prefs;
    private SharedPreferences.Editor editor;
    private int totalCount;
    
  2. onCreate()中初始化:

    prefs = getPreferences(Context.MODE_PRIVATE);
    editor = prefs.edit();
    
  3. 在任何地方打印或计数(onCreate()中的任何位置或您指定的任何特定点击):

     totalCount = prefs.getInt("counter", 0);
     totalCount++;
     editor.putInt("counter", totalCount);
     editor.commit();
    
  4. 现在打印totalCount您要计算的位置,例如:

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

答案 2 :(得分:2)

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

  1. 静态变量: - 静态变量在应用程序开始和结束期间也保留值

  2. 应用程序首选项: - 您可以在应用程序首选项中存储值并使用它

  3. 2和3方法的问题是,如果您关闭并再次打开手机,则会丢失数据。但是如果你仍然想要使用2或3方法,那么2方法非常简单并且

    此处第3种方法的示例代码

    你必须扩展Application类并从那个

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

    你可以在你的清单文件中提及它,如

    <application name="MyApp">
    
    .....
    </application>
    

    在你的活动的onCreate中你可以通过

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

    <强> EDIT1: 子类您的活动和覆盖方法

    public class myActivity extends Activity{
    
       @Override
       onSaveInstanceState(Bundle outState){
          super.onSaveInstanceState(outState);
          counterFlag=true;
       }
    }
    
    当用户按下主页按钮

    时,它会被调用

    并再次覆盖onResume()并检查您的计数器标志是否已启用 并通过子类化MyActivity

    创建所有活动

    如果任何其他活动在点击后退按钮时有退出点,那么您可以覆盖

       @Override
       public void back_pressed(){
    
       }
    

    并相应地完成任务

答案 3 :(得分: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”的值不会改变;但是,如果销毁应用程序进程,则“valueOfLaunchCountModified”的值将更改为false。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我更喜欢使用onResume来跟踪启动计数,因为在显示活动时,每个方案都会调用它(请参阅Android Activity Lifecycle)。

根据使用模式,可以非常频繁地调用

onResume,因此不是跟踪启动计数,而是跟踪启动会话(因为每小时只会跟踪1个启动计数)。

@Synchronized fun appSessionCount(sharedPref: SharedPreferences): Boolean {
    val now = LocalDateTime.now(ZoneOffset.UTC)

    val firstSeconds = sharedPref.getLong(KEY_FIRST_LAUNCH_DATE, 0)
    if (firstSeconds == 0L) {
        sharedPref.edit {
            putLong(KEY_FIRST_LAUNCH_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond())
        }
    }

    val seconds = sharedPref.getLong(KEY_LAST_SESSION_DATE, 0)
    val lastDate = if (seconds > 0) LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneOffset.UTC) else null

    var count = sharedPref.getLong(KEY_SESSION_COUNT, 0)

    // first time or 1 hour ago
    if (lastDate == null || Duration.between(lastDate, now).toHours() >= 1) {
        sharedPref.edit {
            putLong(KEY_SESSION_COUNT, count + 1)
            putLong(KEY_LAST_SESSION_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond())
        }
        return true
    }

    return false
}

我在主要活动的onResume处运行代码。

class MainActivity : AppCompatActivity() {
    lateinit var sharedPref: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        sharedPref = getSharedPreferences("LuaApp", Context.MODE_PRIVATE)
    }

    override fun onResume() {
        super.onResume()

        appSessionCount(sharedPref)
    }
}

https://code.luasoftware.com/tutorials/android/android-track-app-launch-count/