2014-02-08 63 views
3

我是这个世界的新手。当我使用startActivity(intent)时,我遇到了问题。 这是清单:Android中的隐式与显式意图(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(); 

} 

我希望展示飞溅活动5秒钟,然后显示MainActivity。 LogErrors:! https://www.dropbox.com/s/kg7xyp6h4b95itq/Screenshot%202014-02-08%2016.57.36.png 任何解决方案?谢谢

+0

有一个看看不同的[Intent构造函数](http://developer.android.com/reference/android/content/Intent.html#pubctors)。您尝试使用Intent进行启动,该Intent具有不存在的操作并因此出现错误。使用Intent(android.content.Context,java.lang.Class )而不是 – coderplus

回答

3

你必须参考你想开始的class。所以,你需要这样的:

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

什么你传递的是不理解为一个类名Action

+1

'“com.example.counter.MainActivity”'是一个Action而不是简单的String。 –

+0

没错!修改我的答案。谢谢。 – nKn

+0

但一个构造函数public Intent(string action)exists – Marco

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

    } 

} 

我希望现在应该解决您的问题。

+0

如果处理不好,这可能会导致巨大的内存泄漏。我建议阅读这个知道如何获得'Context'没有内存泄漏的危险:http://stackoverflow.com/questions/7144177/getting-the-application-context – nKn

+0

还有一个错误。在第一个指令中,这个字给了我这个问题:“类型不匹配:无法从新线程(){}转换为上下文” – Marco

+0

@ user3035944请发布错误日志 –

1

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

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

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

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

但随后你需要改变所述action在从MainActivity的intent filter

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

到:

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

heyy,我没有找到是否存在任何动作像'' –

+0

[Intent i = new Intent(String action)](http://堆栈溢出。COM /问题/ 11703143 /如何-可以-I-启动的主要活动 - 与最求助的意图过滤器)。 – Ali

+0

有理由改变:安全问题。例如,在这种情况下,竞争应用程序也可以提供“com.example.counter.MainActivity”意图,并且每次打开您的应用程序时,都会询问用户要选择哪个提供程序。隐式意图仅适用于应用程序间服务(例如文档查看器),或转换到/来自应用程序系列中的其他应用程序(通过防止无关联应用程序访问的权限保护它们,除非并且直到您想使意图成为与世界的一部分API合同)。 –

12

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

  1. 使用隐含Intent
  2. 使用一个明确的Intent

参考Intent Types

  1. Intent

声明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); 

这样的隐式Intents被用来当你不明确知道哪些活动已开始,你想在Android系统来决定启动哪个组件。如果系统发现可以处理你的意图的多个组件,它将允许用户选择。

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

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

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

    非常感谢你! – Marco

    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> 
    

    希望它能帮助。

    0

    我认为这是更好,如果你使用的处理程序把这个代码在飞溅的活动在的onCreate

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

    ,如果你想打开它一个时间,它是很好的使用SharedPreferences

    相关问题