Service 中启动 Activity
在 Service 中启动 Activity,有很多方式,比如隐式启动、显式启动等。
隐式启动 Activity,需要在manifest.xml 中为该 Activity 配置 <intent-filter>,如下所示:
- <activity android:name=".MyActivity" >
 - <intent-filter>
 - <action android:name="mark.zhang"></action>
 - <category android:name="android.intent.category.DEFAULT"/>
 - </intent-filter>
 - </activity>
 
MyActivity 是要在 Service 中启动的那个 Activity,为其配置 action、category等。(category 不是必须的)。
在 Service 中这样启动 MyActivity:
- // 等效于
 - // Intent i = new Intent();
 - // i.setAction("mark.zhang");
 - Intent i = new Intent("mark.zhang");
 - // 这个不是必需的
 - i.addCategory(Intent.CATEGORY_DEFAULT);
 - startActivity(i);
 
也可以显式启动 MyActivity ,这中方式不需要在manifest.xml文件中配置,直接写代码:
- Intent i = new Intent(this, DialogActivity.class);
 - startActivity(i);
 
ok,无论你采用哪种方式,运行之后,你可以看到如下信息:
- 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):
 
- Caused by: android.util.AndroidRuntimeException:
 
- Calling startActivity() from outside of an Activity
 
- context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
 - 10-06 19:30:50.895: ERROR/AndroidRuntime(5789): at android.app.ApplicationContext.startActivity(ApplicationContext.java:550)
 - 10-06 19:30:50.895: ERROR/AndroidRuntime(5789): at android.content.ContextWrapper.startActivity(ContextWrapper.java:248)
 - 10-06 19:30:50.895: ERROR/AndroidRuntime(5789): at com.wpstar.receiver.ServerService.onStartCommand(ServerService.java:34)
 - 10-06 19:30:50.895: ERROR/AndroidRuntime(5789): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873)
 - 10-06 19:30:50.895: ERROR/AndroidRuntime(5789): ... 10 more
 
明显的可以看出:
- 10-06 19:30:50.895: ERROR/AndroidRuntime(5789):
 
- Caused by: android.util.AndroidRuntimeException:
 
- Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
 
- Is this really what you want?
 
那麽照做吧!修改代码:
- // 等效于
 - // Intent i = new Intent();
 - // i.setAction("mark.zhang");
 - Intent i = new Intent("mark.zhang");
 - // 这个不是必需的
 - i.addCategory(Intent.CATEGORY_DEFAULT);
 - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 - startActivity(i);
 
或者:
- Intent i = new Intent(this, MyActivity.class);
 - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 - startActivity(i);
 
也就是需要 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),当然也可以这样:
- setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
关于setFlags() 方法与 addFlags() 方法可以查看源码!
                    
                
                
            
        
浙公网安备 33010602011771号