在首次启动 android 应用时从不同的 activity 开始
Start with different activity on first launch of android app
有没有办法在启动时只启动一次不同的 activity?如果我立即从我的主 activity 启动我的设置 activity,会有 1 秒的暂停和白屏。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent myIntent = new Intent(this, home2.class);
this.startActivity(myIntent);
finish();
...
}
尝试将此代码放在 setContentView()
之前
这可以通过多种方式完成。其中之一是使用共享首选项,其中将存储有关访问的数据 activity(例如介绍 activity)。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean isAccessed = prefs.getBoolean(getString(R.string.is_accessed), false);
if(!isAccessed) {
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(getString(R.string.is_accessed), Boolean.TRUE);
edit.commit();
showIntroActivity();
} else {
startReqularActivity();
}
还有更多方法可以完成该请求(例如 -> 将访问状态存储在数据库或属性文件中,或者如果必须从某些后台控制应用程序,则将其存储在云中)。 IMO 这是实现该功能的最佳方式 - 当然也是最简单的方式。
这只是想法(功能齐全),您可以根据需要进行调整。
Erik Hellman 在 Android Programming Pushing the Limits 一书中描述了一个解决方案。您需要执行以下操作:
创建您的活动(好吧,我们只说它们是主要活动和设置活动)并将它们添加到您的清单中:
<activity
android:name=”.SetupActivity”
android:label=”@string/app_name_setup”
android:icon=”@drawable/app_setup_icon”
android:enabled=”true”>
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
<category android:name=”android.intent.category.LAUNCHER”/>
</intent-filter>
</activity>
<activity
android:name=”.MainActivity”
android:label=”@string/app_name”
android:icon=”@string/app_icon”
android:enabled=”false”>
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
<category android:name=”android.intent.category.LAUNCHER”/>
</intent-filter>
</activity>
当显示 Setup Activity 时,禁用它并以编程方式启用 Main Activity:
PackageManager packageManager = getPackageManager();
packageManager
.setComponentEnabledSetting(new ComponentName(this, MainActivity.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
packageManager
.setComponentEnabledSetting(new ComponentName(this, SetupActivity.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
我还没有尝试过,但它仍然可以正常工作。
我认为您的原始代码与您想要的非常接近。
不过,您需要做几件事才能使其在视觉上发挥作用。
首先,仅当您确实打算显示 MainActivity 时才调用 setContentView。
其次,确保 SetupActivity 快速加载以避免延迟。这意味着确保你没有在 onCreate 中做任何事情 time-consuming。
那么,您可以将 MainActivity 的代码更改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isFirstTime()) {
startActivity(new Intent(this, SetupActivity.class));
finish();
} else {
setContentView(R.layout.activity_main);
... // anything else that you need to do to initialize MainActivity
}
}
有没有办法在启动时只启动一次不同的 activity?如果我立即从我的主 activity 启动我的设置 activity,会有 1 秒的暂停和白屏。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent myIntent = new Intent(this, home2.class);
this.startActivity(myIntent);
finish();
...
}
尝试将此代码放在 setContentView()
这可以通过多种方式完成。其中之一是使用共享首选项,其中将存储有关访问的数据 activity(例如介绍 activity)。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean isAccessed = prefs.getBoolean(getString(R.string.is_accessed), false);
if(!isAccessed) {
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(getString(R.string.is_accessed), Boolean.TRUE);
edit.commit();
showIntroActivity();
} else {
startReqularActivity();
}
还有更多方法可以完成该请求(例如 -> 将访问状态存储在数据库或属性文件中,或者如果必须从某些后台控制应用程序,则将其存储在云中)。 IMO 这是实现该功能的最佳方式 - 当然也是最简单的方式。
这只是想法(功能齐全),您可以根据需要进行调整。
Erik Hellman 在 Android Programming Pushing the Limits 一书中描述了一个解决方案。您需要执行以下操作:
创建您的活动(好吧,我们只说它们是主要活动和设置活动)并将它们添加到您的清单中:
<activity android:name=”.SetupActivity” android:label=”@string/app_name_setup” android:icon=”@drawable/app_setup_icon” android:enabled=”true”> <intent-filter> <action android:name=”android.intent.action.MAIN”/> <category android:name=”android.intent.category.LAUNCHER”/> </intent-filter> </activity> <activity android:name=”.MainActivity” android:label=”@string/app_name” android:icon=”@string/app_icon” android:enabled=”false”> <intent-filter> <action android:name=”android.intent.action.MAIN”/> <category android:name=”android.intent.category.LAUNCHER”/> </intent-filter> </activity>
当显示 Setup Activity 时,禁用它并以编程方式启用 Main Activity:
PackageManager packageManager = getPackageManager(); packageManager .setComponentEnabledSetting(new ComponentName(this, MainActivity.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); packageManager .setComponentEnabledSetting(new ComponentName(this, SetupActivity.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
我还没有尝试过,但它仍然可以正常工作。
我认为您的原始代码与您想要的非常接近。 不过,您需要做几件事才能使其在视觉上发挥作用。
首先,仅当您确实打算显示 MainActivity 时才调用 setContentView。 其次,确保 SetupActivity 快速加载以避免延迟。这意味着确保你没有在 onCreate 中做任何事情 time-consuming。
那么,您可以将 MainActivity 的代码更改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isFirstTime()) {
startActivity(new Intent(this, SetupActivity.class));
finish();
} else {
setContentView(R.layout.activity_main);
... // anything else that you need to do to initialize MainActivity
}
}