【问题标题】:App launches on wrong activity应用程序在错误的活动上启动
【发布时间】:2012-05-03 06:00:23
【问题描述】:

我的 Android 应用似乎在错误的活动上启动。

AndroidManifest.xml 中的重要部分:

“MainActivity”应该是应用启动时启动的活动:

<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="AnotherActivity"
    android:label="@string/app_name">
</activity>

主活动:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //display into log that THIS activity is started
        Log.d("tag", "MainActivity");

        //start async task to install the database on first startup
        progressDialog = ProgressDialog.show([params...]);
        new InstallDatabaseTask().execute(this);
}

/**
 * 1. Installs and initializes the database.
 * 2. Opens another activity.
 */
private class InstallDatabaseTask extends AsyncTask {

        @Override
        protected Object doInBackground(Object... params) {
            progressDialog.show();

            //open database so it can be installed
            MyOpenHelper helper = new MyOpenHelper((Context) params[0]);
            helper.getWritableDatabase().close();

            //dismiss progress dialog
            MainActivity.this.progressDialog.dismiss();

            //start another activity
            Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
            ((Context)params[0]).startActivity(intent);

            return null;
        }
}

另一个活动:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //just make sure this activity was started
        Log.d("tag", "another activity started");   
    }

但是日志只显示“另一个活动开始了”。

【问题讨论】:

  • 我认为你必须崩溃,因为你的异步任务有问题
  • 但似乎没有任何崩溃。输出中没有任何错误。但是,任务运行。并安装了数据库。
  • 你试过@autobot_101的建议
  • 我做了,正如我回复他的帖子一样
  • 正在启动另一个活动

标签: android android-intent android-activity launch


【解决方案1】:

从您的代码中,我了解到 android 正在启动正确的活动。

但是在您的 oncreate 方法中,您正在调用异步任务,因此一旦主要活动创建它就会启动异步任务,并且在您的异步任务中,您正在调用以下行

//start another activity
Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
((Context)params[0]).startActivity(intent);

所以只要异步任务完成它的任务,它就会启动另一个活动。所以你假设android正在启动错误的活动。但是在内部,您正在启动活动,并且您的异步仅在几微秒内完成,因此您假设启动了错误的活动..

【讨论】:

  • 在行中:MyOpenHelper helper = new MyOpenHelper((Context) params[0]); helper.getWritableDatabase().close(); 应用程序正在安装数据库。之后,该活动被调用。所以这不应该是问题。并且应用程序没有按预期将“MainActivity”打印到日志中。
【解决方案2】:

您无法从不是 UI 线程的线程中通过 doInBackground() 方法(和其他 UI 小部件)访问进度对话框。你应该把它放在onPostExecute()

类似:

private class InstallDatabaseTask extends AsyncTask <Void, Void, Void>{

    @Override
    protected Object doInBackground(Object... params) {
        progressDialog.show();

        //open database so it can be installed
        MyOpenHelper helper = new MyOpenHelper((Context) params[0]);
        helper.getWritableDatabase().close();



        return null;
    }

    @Override
    protected void onPostExecute(Void result){

        //dismiss progress dialog
                    MainActivity.this.progressDialog.dismiss();

                    //start another activity
                    Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
                    ((Context)params[0]).startActivity(intent);
    }

}

我认为你需要在扩展 AsyncTask 时声明参数。

我不确定这是否能解决您的问题,但只是一个提示...

【讨论】:

  • 谢谢,改了,但正如你所说,这并没有解决我的问题。
  • 而且很长一段时间,它都是这样工作的——不知道为什么它不再起作用了。
【解决方案3】:

还有一件事,你在 Manifest 文件中声明的 AnotherActivity 有问题,不是吗?

<activity
    android:name="AnotherActivity"
    android:label="@string/app_name">
</activity>

我认为它应该有一个点。喜欢

android:name=".AnotherActivity"

【讨论】:

  • 不。我建议“点”仅代表应用程序的默认目录,尽管我更改了它但没有结果。还不行。
【解决方案4】:

在清单中,确保正在启动的活动而不是主活动设置为默认值。

类别 android:name="android.intent.category.DEFAULT"

        <intent-filter>
            <action android:name="com.game.test.DIRECTOR" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

所以它不会作为主启动。还要检查清单中的意图过滤器,看看它们是否正确或存在。

【讨论】:

  • category.DEFAULT 阻止图标显示在应用程序网格中。在某些情况下,这是将婴儿与洗澡水一起扔掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多