仅在首次启动应用程序时,如何启动具有特定活动的应用程序?

慰藉

我只想在我的App首次启动时就启动一个Activity,从那时起,该App应该每次都与另一个(启动器)Activity一起启动。因此,我基于此SO答案实施了一个解决方案

该解决方案围绕一种boolean偏好(startedBeforePreferenceKey在以下代码中具有作为键偏好)进行。onCreate()启动程序活动的中,我尝试使用键检索首选项startedBeforePreferenceKey并将其存储在变量中startedBefore如果首选项不存在,startedBefore则分配false

然后,我检查是否startedBeforefalse如果,则创建所提到的首选项,为其赋予一个值true并将其存储在中SharedPreferences,然后启动此活动,该活动应首次启动该应用程序。这样,当下次执行该检查时onCreate()startedBefore将分配该检查true,因此一次启动活动将不会开始。

问题在于,当首次启动该应用程序时,普通启动器会在该活动之前立即显示,只有在首次启动该应用程序时才应启动该应用程序

首次启动该应用程序时,普通启动器完全不显示。直接,应该显示我想在应用程序首次启动时显示的特殊活动。

我该怎么办?

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean startedBefore = sharedPreferences.getBoolean(getString(R.string.startedBeforePreferenceKey), false);

if (!startedBefore) {
    SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
    sharedPreferencesEditor.putBoolean(getString(R.string.startedBeforePreferenceKey), true);
    sharedPreferencesEditor.commit();
    startActivity(new Intent(this, MainActivity.class)); 
} 

编辑: @HammadTariqSahi

首先,摘录自LogCat:

03-16 08:42:25.629: E/AndroidRuntime(1837): FATAL EXCEPTION: main
03-16 08:42:25.629: E/AndroidRuntime(1837): Process: tests.globalactivitytest, PID: 1837
03-16 08:42:25.629: E/AndroidRuntime(1837): java.lang.RuntimeException: Unable to instantiate application tests.globalactivitytest.activity.GlobalActivity: java.lang.ClassNotFoundException: Didn't find class "tests.globalactivitytest.activity.GlobalActivity" on path: DexPathList[[zip file "/data/app/tests.globalactivitytest-1/base.apk"],nativeLibraryDirectories=[/data/app/tests.globalactivitytest-1/lib/x86, /vendor/lib, /system/lib]]
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.LoadedApk.makeApplication(LoadedApk.java:578)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.ActivityThread.-wrap1(ActivityThread.java)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.os.Looper.loop(Looper.java:148)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.ActivityThread.main(ActivityThread.java:5417)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at java.lang.reflect.Method.invoke(Native Method)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-16 08:42:25.629: E/AndroidRuntime(1837): Caused by: java.lang.ClassNotFoundException: Didn't find class "tests.globalactivitytest.activity.GlobalActivity" on path: DexPathList[[zip file "/data/app/tests.globalactivitytest-1/base.apk"],nativeLibraryDirectories=[/data/app/tests.globalactivitytest-1/lib/x86, /vendor/lib, /system/lib]]
03-16 08:42:25.629: E/AndroidRuntime(1837):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.Instrumentation.newApplication(Instrumentation.java:981)
03-16 08:42:25.629: E/AndroidRuntime(1837):     at android.app.LoadedApk.makeApplication(LoadedApk.java:573)
03-16 08:42:25.629: E/AndroidRuntime(1837):     ... 9 more
03-16 08:42:25.629: E/AndroidRuntime(1837):     Suppressed: java.lang.ClassNotFoundException: tests.globalactivitytest.activity.GlobalActivity
03-16 08:42:25.629: E/AndroidRuntime(1837):         at java.lang.Class.classForName(Native Method)
03-16 08:42:25.629: E/AndroidRuntime(1837):         at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
03-16 08:42:25.629: E/AndroidRuntime(1837):         at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
03-16 08:42:25.629: E/AndroidRuntime(1837):         at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
03-16 08:42:25.629: E/AndroidRuntime(1837):         ... 12 more
03-16 08:42:25.629: E/AndroidRuntime(1837):     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

GlobalActivity.java:

package tests.globalactivitytest;

import android.app.Application;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class GlobalActivity extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        //SharedPreferences.Editor editor = sharedPreferences.edit(); 
        boolean launchedBefore = sharedPreferences.getBoolean("launchedBefore", false);
        if (launchedBefore) {
            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        } else {
            Intent intent = new Intent(this, LaunchOnceActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    }
}

MainActivity.java:

package tests.globalactivitytest;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

LaunchOnceActivity.java:

package tests.globalactivitytest;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class LaunchOnceActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch_once);
    }
}

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tests.globalactivitytest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="23" />

    <application
        android:name=".activity.GlobalActivity"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LaunchOnceActivity"
            android:label="@string/title_activity_launch_once" >
        </activity>
    </application>

</manifest>
显影

上面的答案也很好,但是如果您需要在没有启动活动的情况下进行操作,则可以使用以下方法

步骤1:创建一个新类,从Application扩展并添加以下代码(不要忘记相应地更改您的活动名称)。其中最重要的部分是在开始任何活动之前设置适当的意图标志。

此GlobalActivity将在启动器活动之前被调用

public class GlobalActivity extends Application {


@Override
public void onCreate() {
    super.onCreate();
  SharedPreferences userInfo = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  SharedPreferences.Editor  editor = userInfo.edit();
  boolean logedIn =  userInfo.getBoolean("loggedIn", false);
    if (logedIn)
    {
        Intent intent = new Intent(this,MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }
    else {
        Intent intent = new Intent(this,LaunchOnceActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }
}
}

步骤2:清单文件应如下所示

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.app.appid" >


<application
android:name=".GlobalActivity"
android:allowBackup="true"
android:icon="@drawable/launch"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".LaunchOnceActivity"
    android:label="Launch Once" >
</activity>
</application>
</manifest>

然后在任何活动中相应地更改loginIn varibale,以备将来使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何跟踪应用程序的首次启动?

来自分类Dev

如何跟踪应用程序的首次启动?

来自分类Dev

每次启动应用程序时启动活动

来自分类Dev

在首次启动应用程序时显示对话框

来自分类Dev

从应用程序启动特定活动

来自分类Dev

活动堆栈会在首次启动应用程序时不断重置

来自分类Dev

如何使用SwiftUI在首次启动应用程序时启动教程?

来自分类Dev

在android中-有人关闭应用程序时如何启动活动?

来自分类Dev

如何在启动应用程序时选择一个活动作为启动活动?

来自分类Dev

选择特定的tabItem()以在首次启动闪亮应用程序时默认显示

来自分类Dev

启动应用程序时会调用哪个活动?

来自分类Dev

退出应用程序时出现启动画面活动

来自分类Dev

启动Android应用程序时如何启动服务?

来自分类Dev

启动Android应用程序时如何启动服务?

来自分类Dev

注册GCM后首次启动应用程序时如何获取GCM注册ID?

来自分类Dev

如何在首次启动应用程序时触发教程(Android)

来自分类Dev

首次启动后应用程序崩溃

来自分类Dev

首次启动后应用程序崩溃

来自分类Dev

从最新消息启动应用程序时重定向到特定的活动

来自分类Dev

启动应用程序时缺少图标

来自分类Dev

启动应用程序时缺少图标

来自分类Dev

启动应用程序时出错

来自分类Dev

启动我的应用程序时出错

来自分类Dev

启动应用程序时发生错误

来自分类Dev

如果应用程序是首次启动,如何显示页面

来自分类Dev

如果是首次启动应用程序,如何显示页面

来自分类Dev

如何跟踪应用程序是否首次在Android中启动?

来自分类Dev

Xcode UI测试:如何测试应用程序的首次启动

来自分类Dev

具有启动参数的Erlang escript启动应用程序

Related 相关文章

  1. 1

    如何跟踪应用程序的首次启动?

  2. 2

    如何跟踪应用程序的首次启动?

  3. 3

    每次启动应用程序时启动活动

  4. 4

    在首次启动应用程序时显示对话框

  5. 5

    从应用程序启动特定活动

  6. 6

    活动堆栈会在首次启动应用程序时不断重置

  7. 7

    如何使用SwiftUI在首次启动应用程序时启动教程?

  8. 8

    在android中-有人关闭应用程序时如何启动活动?

  9. 9

    如何在启动应用程序时选择一个活动作为启动活动?

  10. 10

    选择特定的tabItem()以在首次启动闪亮应用程序时默认显示

  11. 11

    启动应用程序时会调用哪个活动?

  12. 12

    退出应用程序时出现启动画面活动

  13. 13

    启动Android应用程序时如何启动服务?

  14. 14

    启动Android应用程序时如何启动服务?

  15. 15

    注册GCM后首次启动应用程序时如何获取GCM注册ID?

  16. 16

    如何在首次启动应用程序时触发教程(Android)

  17. 17

    首次启动后应用程序崩溃

  18. 18

    首次启动后应用程序崩溃

  19. 19

    从最新消息启动应用程序时重定向到特定的活动

  20. 20

    启动应用程序时缺少图标

  21. 21

    启动应用程序时缺少图标

  22. 22

    启动应用程序时出错

  23. 23

    启动我的应用程序时出错

  24. 24

    启动应用程序时发生错误

  25. 25

    如果应用程序是首次启动,如何显示页面

  26. 26

    如果是首次启动应用程序,如何显示页面

  27. 27

    如何跟踪应用程序是否首次在Android中启动?

  28. 28

    Xcode UI测试:如何测试应用程序的首次启动

  29. 29

    具有启动参数的Erlang escript启动应用程序

热门标签

归档