我正在开发一个应用程序,其中在用户打开应用程序5次之后,在第6次尝试时应用程序应该询问用户的反馈。我尝试使用活动OnStart
,OnResume
,但由于即使离开并重新进入活动后这些方法也被调用,因此无法解决问题。此外,根据Android功能,我不能退出应用程序,以便我可以从第一个被调用的活动中找到它。如何找到应用程序启动的次数?
我希望这不会令人困惑。
修改
或者有一种方法,一旦用户按下主页退出应用程序,我总是可以从第一个活动(或例如,欢迎页面)恢复我的应用程序。
答案 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)
只需:
声明:
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();
现在打印totalCount
您要计算的位置,例如:
System.out.println("Total Application counter Reach to :"+totalCount);
答案 2 :(得分:2)
如果您有应用启动的启动活动,那么您可以通过以下方式实施它 1.数据库: - 通过数据库,您可以保存应用程序启动计数,并在创建活动时检索它。
静态变量: - 静态变量在应用程序开始和结束期间也保留值
应用程序首选项: - 您可以在应用程序首选项中存储值并使用它
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/