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

时间:2014-02-08 15:12:36

标签: 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>

这是代码:

 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();

}

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

6 个答案:

答案 0 :(得分:14)

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

  1. 使用隐式Intent
  2. 使用明确的Intent
  3. 参考Intent Types

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

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

      现在,您可以使用相同的Activity

      启动Intent
      Intent i=new Intent ("com.example.counter.MainAction");
      startActivity(i);
      

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

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

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

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

答案 1 :(得分:3)

您必须引用您想要开始的class。所以你需要这样的东西:

Intent newAct = new Intent(this, Splash.class);
startActivity(newAct);

您传递的内容是Action,不能被理解为类名。

答案 2 :(得分:1)

我猜,Splash是您的启动器活动,在您的清单文件中进行以下更改:

<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" >
</activity>

以这种方式开展活动:

public class Splash extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        /*Splach screen that display for 5 seconds when app start*/
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent i = new Intent(Splash.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }, 5000);

    }

}

我希望现在能解决你的问题。

答案 3 :(得分:1)

我认为你应该能够使用(隐含意图):

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

没有理由将其更改为(明确意图):

startActivity(new Intent(mContext, MainActivity.class));

但是您需要更改MainActivity的action中的intent filter

<action android:name="android.intent.action.MAIN" />

为:

<action android:name="com.example.counter.MainActivity"/>

答案 4 :(得分:0)

您需要在清单文件中declare an activity

像这样:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".FirstActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activty
        android:name="com.example.counter.MainActivity"/>
</application>

希望它有所帮助。

答案 5 :(得分:0)

我认为如果你使用Handler将此代码放在onCreate的splash活动中会更好

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 1500); 

如果你想打开它一次,最好使用SharedPreferences