Android中的隐式vs显式意图(startActivity(intent)崩溃)

Mar*_*rco 6 android android-intent android-activity

我是这个世界的新人.我使用startActivity(intent)时遇到问题.这是清单:

<activity
        android:name="com.example.counter.Splash"
        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.counter.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
Run Code Online (Sandbox Code Playgroud)

这是代码:

 public class Splash extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.splash);

    Thread timer = new Thread(){
        public void run()
        {
            try
            {
                sleep(5000);

            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            finally
            {

                Intent i=new Intent ("com.example.counter.MainActivity");
                startActivity(i);
            }
        }
    };

    timer.start();

}
Run Code Online (Sandbox Code Playgroud)

我想要显示Splash活动5秒钟,然后显示MainActivity.LogErrors:!https://www.dropbox.com/s/kg7xyp6h4b95itq/Screenshot%202014-02-08%2016.57.36.png

cod*_*lus 14

有两种方法可以做你想做的事情.

  1. 使用隐式 Intent
  2. 使用显式 Intent

参考意图类型

  1. 含蓄 Intent

声明Intent Filters你Activity在你的AndroidManifest.xml.通过这样做,Android系统可以了解Intents您的组件(在这种情况下,您的MainActivity)可以处理的类型.

    <activity
    android:name="com.example.counter.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="com.example.counter.MainAction" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <activity>
Run Code Online (Sandbox Code Playgroud)

现在你可以Activity用同样的方式启动你了Intent

Intent i=new Intent ("com.example.counter.MainAction");
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

Intents当您没有明确知道哪个Activity必须启动并且您希望Android系统决定启动哪个组件时,会使用这种隐式.如果系统找到多个可以处理您的Intent的组件,它将允许用户选择.

注意:可能没有可以处理您意图的应用程序.在这种情况下,当您调用startActivity()时,您的应用程序将崩溃.为避免这种情况,在调用startActivity()之前,首先应验证系统中是否至少有一个可以处理意图的应用程序.为此,请在intent对象上使用resolveActivity().

  1. 明确的 Intent

在您的情况下,您应该使用明确的,Intent因为您已经知道Activity要启动哪个.因此,Intent通过传递上下文和要启动的组件(Activity)类来创建.

  Intent i=new Intent (this,MainActivity.class);
  startActivity(i);
Run Code Online (Sandbox Code Playgroud)


nKn*_*nKn 3

您必须引用class您想要开始的内容。所以你需要类似的东西:

Intent newAct = new Intent(this, Splash.class);
startActivity(newAct);
Run Code Online (Sandbox Code Playgroud)

您传递的是一个Action不被理解为类名的名称。