【问题标题】:how to start new activity in android如何在android中启动新活动
【发布时间】:2014-03-24 16:11:55
【问题描述】:

我想在单击按钮时启动一个名为 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>

【问题讨论】:

  • 发布您的清单文件
  • 你能检查我的答案吗? :-)

标签: java android android-intent


【解决方案1】:
Intent intent = new Intent(MyActivity.this, OtherActivity.class);
startActivity(intent);

【讨论】:

    【解决方案2】:

    改变这个

       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

    【讨论】:

    【解决方案3】:

    你可以替换这个

                    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-filer ..

    【讨论】:

    • 不需要意图过滤器
    • 你可以去掉不需要的或部分
    • @AhmedEkri :您的最后一段代码确实正确显示了如何使用隐式 Intent 但有两点...首先,您应该明确定义用于隐式 Intent 的意图过滤器应该仅当您的 Activity 将由 3rd 方应用程序使用时才完成。其次,不要从 android.intent.action... 派生您的 Intent 操作 - 这不是您的命名空间,如果(例如)Android 开发人员定义与您的 Activity 无关的 COUNTER 操作,您可能会感到困惑。
    【解决方案4】:

    你应该有t.start();。那是启动线程的函数。

    【讨论】:

      【解决方案5】:

      您可能还想尝试在 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() 将阻止任何进一步的操作,直到它完成。

      【讨论】:

        最近更新 更多