应用程序启动错误的活动

时间:2012-04-22 09:21:48

标签: android android-intent android-activity launch

好像我的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>

MainActivity:

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;
        }
}

AnotherActivity:

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

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

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

4 个答案:

答案 0 :(得分:2)

从你的代码我知道android正在启动正确的活动。

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

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

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

答案 1 :(得分:1)

您无法从不是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时声明参数。

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

答案 2 :(得分:0)

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

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

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

  

机器人:名称= “AnotherActivity”

答案 3 :(得分:-1)

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

类别android:name =“android.intent.category.DEFAULT”

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

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