如何像启动画面一样只运行一次活动
Posted
技术标签:
【中文标题】如何像启动画面一样只运行一次活动【英文标题】:How to run an activity only once like Splash screen 【发布时间】:2013-09-07 21:36:50 【问题描述】:在我的应用程序中,我只想在第一次运行时运行一次启动画面,但问题是我已经将这一行放在Manifest
中:android:noHistory="true"
如果我按下返回按钮并退出应用程序,但请注意,该应用程序仍在后台运行,当我按下应用程序图标时,它会再次返回启动画面,然后是我的注册页面。当我重新打开我的应用程序时,我想直接重定向到注册页面。
我该怎么做?提前感谢您的任何建议。
【问题讨论】:
使用共享偏好。 ***.com/questions/8779929/… 使用共享偏好设置任何布尔值,并创建一个类似appstart的类,在此获取共享偏好值,如果其为真则启动SplashScreen的意图,如果为假则启动注册意图页面。 如何可视化启动画面?您应该在onResume
方法中禁用此加载。
@Compaq LE2202x-把你的代码放在你试过的地方......
@Raghunandan 感谢您的链接,但我实际上并没有得到它。我应该将onActivityResult
放在我的Splash Activity 还是Registration Activity 中?我都试过了,但似乎onActivityResult
没有被调用?
【参考方案1】:
这就是我实现它的方法!希望它有所帮助!
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
public class check extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
SharedPreferences settings=getSharedPreferences("prefs",0);
boolean firstRun=settings.getBoolean("firstRun",false);
if(firstRun==false)//if running for first time
//Splash will load for first time
SharedPreferences.Editor editor=settings.edit();
editor.putBoolean("firstRun",true);
editor.commit();
Intent i=new Intent(check.this,Splash.class);
startActivity(i);
finish();
else
Intent a=new Intent(check.this,Main.class);
startActivity(a);
finish();
【讨论】:
而不是在活动上调用完成()。要从活动堆栈中删除活动,只需在清单中使用 android:noHistory="true" 非常简单,非常有用!非常感谢【参考方案2】:您可以使用 Shared Preferences 在首次启动时运行应用程序时保存一些布尔值,然后在每次启动时检查该值,如果退出,然后直接启动注册活动。
虽然,这种仅保存正常值的方法存在一个漏洞,假设您的应用 安装在用户设备上,用户刚刚用新的更新了应用程序 没有卸载第一个版本,那么在这种情况下你也 不会看到 Splash,因为旧的共享偏好已经存在 有那个旧的保存值。
因此,在这种情况下,您需要通过保存应用版本并在每次启动时检查应用版本来稍微更改逻辑,这样您才能产生真实的用户体验。 p>
看看这个:How to create a one-time welcome screen using Android preferences?
【讨论】:
谢谢你,我稍后会使用它,但现在我仍然对“运行一次”有问题。【参考方案3】:为了详细说明“共享偏好”的提及,如果您将其插入主要活动的 onCreate() 中,我相信以下内容会起作用:
SharedPreferences settings = this.getSharedPreferences("appInfo", 0);
boolean firstTime = settings.getBoolean("first_time", true);
if (firstTime)
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("first_time", false);
editor.commit();
块执行后,“firstTime”应指示这是否是应用程序第一次运行。我相信“appInfo”只是一个占位符名称,表示您希望调用首选项文件。
【讨论】:
@CompaqLE2202x 抱歉;错过了 - 当人们这样做时,我也讨厌它。ctx
代表Context(一个Activity也是一个Context),在onCreate()中应该是this
。【参考方案4】:
这就是我在 SplashActivity(onCreate) 中所做的:
SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("firstRun", true);
editor.commit();
Intent intent = new Intent(this, RegistrationActivity.class);
startActivity(intent);
SplashActivity(onResume):
@Override
public void onResume()
super.onResume();
SharedPreferences settings = getSharedPreferences("prefs", 0);
boolean firstRun = settings.getBoolean("firstRun", true);
if (!firstRun)
Intent intent = new Intent(this, RegistrationActivity.class);
startActivity(intent);
Log.d("TAG1", "firstRun(false): " + Boolean.valueOf(firstRun).toString());
else
Log.d("TAG1", "firstRun(true): " + Boolean.valueOf(firstRun).toString());
在我的 RegistrationActivity(onCreate) 中:
SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("firstRun", false);
editor.commit();
boolean firstRun = settings.getBoolean("firstRun", true);
Log.d("TAG1", "firstRun: " + Boolean.valueOf(firstRun).toString());
然后禁用返回按钮以防止返回,除非用户按下 Home:
@Override
public void onBackPressed()
非常感谢那些做出贡献的人!
【讨论】:
【参考方案5】:最简单的方法 您可以在清单文件中使用 android:noHistory="true"。
【讨论】:
应用关闭再打开后就不行了。 android:noHistory=“true” 只保证splash Activity不留在后栈中,不保证splash Activity不会再次OnCtreate(d)。以上是关于如何像启动画面一样只运行一次活动的主要内容,如果未能解决你的问题,请参考以下文章