在Android中如何启动新活动

3

我希望在点击一个按钮时启动一个名为Counter的新活动,但是我遇到了一个错误,提示找不到该活动...请问我的代码哪里出错了:

t = new Thread(){

            public void run(){

                try{

                    sleep(5000);
                }
                catch (InterruptedException e){

                    e.printStackTrace();
                }
                finally{

                    Intent counter = new Intent("com.example.test.Counter");
                    startActivity(counter);
                }
            }
        };

        test.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                t.run();
            }
        });

这是清单文件:

这是清单文件:

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

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.test.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="com.example.test.Counter"
            android:label="@string/title_activity_counter" >
        </activity>
    </application>

</manifest>

发布你的清单文件。 - Raghunandan
你能帮我检查一下我的答案吗?:-) - BSK-Team
5个回答

2
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
startActivity(intent);

1

你应该使用 t.start();。这是启动线程的函数。


1
你可以替换这个

标签


                Intent counter = new Intent("com.example.test.Counter");
                startActivity(counter);

使用这个,它将会工作。。
                Intent counter = new Intent(MainActivity.this, Counter.class);
                startActivity(counter);

或者,为了让你的代码工作,你缺少了intent-filter

<activity
    android:name="com.example.test.Counter"
    android:label="@string/title_activity_counter" >
    <intent-filter>
        <action android:name="android.intent.action.COUNTER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

如果您想使用自己的方式启动活动,应始终提供一个intent-filter。请参考以下内容:

意图过滤器不需要。 - Raghunandan
你可以只保留需要的部分 - Raghunandan
2
@AhmedEkri:你的最后一段代码确实展示了如何使用隐式Intent,但有两点需要注意。首先,如果你的Activity只是用于第三方应用程序,则应明确说明为其定义一个intent-filter。其次,不要从android.intent.action...派生你的Intent操作 - 这不是你的命名空间,如果(例如)Android开发人员定义了一个与你的Activity无关的“COUNTER”操作,你就会面临混淆的风险。 - Squonk

1

改变这个

   Intent counter = new Intent("com.example.test.Counter");
   startActivity(counter);

这被称为隐式意图,需要意图过滤器。

  Intent counter = new Intent(MainActivity.this,Counter.class);
  startActivity(counter);

这被称为显式意图,不需要意图过滤器。

你应该使用显式意图,因为你有明确的目的。

   <activity
        android:name="com.example.test.Counter"
        android:label="@string/title_activity_counter" >
    </activity>

引用文档

显式意图通过名称(完全限定的类名)指定要启动的组件。 通常会使用显式意图在您自己的应用程序中启动组件,因为您知道要启动的活动或服务的类名。例如,在响应用户操作时启动新活动或启动服务以在后台下载文件。

注意:无论组件声明任何意图过滤器,显式意图始终会传递到其目标。

编辑:

您应该在线程上调用start()而不是run


@user3194430 更多参考请查看 https://dev59.com/a3VC5IYBdhLWcg3wihqv - Raghunandan

1
您可能还想尝试在UI线程上运行,通过将finally块的内容替换为以下内容:
MyActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        Intent counter = new Intent(MyActivity.this, Counter.class);
        MyActivity.this.startActivity(counter);
    }
};

正如其他人所说,使用t.start()而不是t.run(),因为run()将阻止任何进一步的操作直到它完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接