Service 中启动 Activity

在 Service 中启动 Activity,有很多方式,比如隐式启动、显式启动等。


隐式启动 Activity,需要在manifest.xml 中为该 Activity 配置 ,如下所示:

  1. <activity android:name=".MyActivity" >  
  2.         <intent-filter>  
  3.             <action android:name="mark.zhang">action>  
  4.             <category android:name="android.intent.category.DEFAULT"/>  
  5.         intent-filter>  
  6. activity>  

MyActivity 是要在 Service 中启动的那个 Activity,为其配置 action、category等。(category 不是必须的)。


在 Service 中这样启动 MyActivity:

  1. // 等效于  
  2. // Intent i = new Intent();  
  3. // i.setAction("mark.zhang");  
  4. Intent i = new Intent("mark.zhang");  
  5. // 这个不是必需的  
  6. i.addCategory(Intent.CATEGORY_DEFAULT);  
  7. startActivity(i);  


也可以显式启动 MyActivity ,这中方式不需要在manifest.xml文件中配置,直接写代码:

  1. Intent i = new Intent(this, DialogActivity.class);  
  2. startActivity(i);  

ok,无论你采用哪种方式,运行之后,你可以看到如下信息:

  1. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):   
  1. Caused by: android.util.AndroidRuntimeException:   
  1. Calling startActivity() from outside of an Activity    
  1. context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?  
  2. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):     at android.app.ApplicationContext.startActivity(ApplicationContext.java:550)  
  3. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):     at android.content.ContextWrapper.startActivity(ContextWrapper.java:248)  
  4. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):     at com.wpstar.receiver.ServerService.onStartCommand(ServerService.java:34)  
  5. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873)  
  6. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):     ... 10 more  

明显的可以看出:

  1. 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):   
  1. Caused by: android.util.AndroidRuntimeException:   
  1. Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag.   
  1. Is this really what you want?  

那麽照做吧!修改代码:

  1. // 等效于  
  2. // Intent i = new Intent();  
  3. // i.setAction("mark.zhang");  
  4. Intent i = new Intent("mark.zhang");  
  5. // 这个不是必需的  
  6. i.addCategory(Intent.CATEGORY_DEFAULT);  
  7. i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  8. startActivity(i);  

或者:

  1. Intent i = new Intent(this, MyActivity.class);  
  2. i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  3. startActivity(i);  

也就是需要 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),当然也可以这样:

  1. setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);  

关于setFlags() 方法与 addFlags() 方法可以查看源码!


你可能感兴趣的:(android)