先贴我要通过service启动的activity的manifest里面的配置参数,这个activity是程序的启动函数,也就是入口函数
- Java code
<activity android:name=".TestActivity" android:label="@string/app_name" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
下面是我的service定义
- Java code
<service android:name=".StartService" > <intent-filter> <action android:name="com.astrob.START_SERVICELINGHUA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
下面是我的service在收到启动acitivty的的广播时发送命令的代码
- Java code
Intent it = new Intent(getBaseContext() , TestActivity.class); it.putExtra("Data", extras.getString("Data")); it.setAction(Intent.ACTION_MAIN); it.addCategory(Intent.CATEGORY_LAUNCHER); it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); it.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT ); it.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startActivity(it);
执行上面的service后TestActivity启动,取下Data里面的数值,在里面做相应的运算,一切正常,可是 后面问题来了
问题:
1.在执行相应的运算后 我按home键 也就是让程序隐藏在后台 然后,我按住home键 会出现最近运行的程序,对吧?
通常情况下我们点程序的图标如果这个程序在后台运行应该是恢复到隐藏这个程序时的界面状态,可是现在在我的程序里,点击图标的话,弹出程序窗口后,他会再运算一次,这个运算二话在执行上面service语句后运算的状态一样,包括数据也一样,我通过打印log发现TestActivity先ondestory,然后oncreate了,根本不是应该出现的onrestart,onstart,onresume 我这个是怎么回事?怎么解决?
我的想法是既然你都执行了ondestory了并执行oncreate了 为什么隐藏之前发过来的那个intent里的数据都还在呢?
我跟踪service,他并没有再发送intent给TestActivity了。
2.service是不是在非正常被结束时会自动重启?怎么让他在被kill掉后(不管是正常还是不正常)都不自动重启?
上面的2个问题,第一个对我来说比较难,希望高手能来解决下,谢谢指教了!
------解决方案--------------------
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
跟这个有关系吧? 为什么加这两句?
------解决方案--------------------
一般来说,在service中启动activity,只要设置这个就可以了Intent.FLAG_ACTIVITY_NEW_TASK。
怀疑你的service又启动了一次这个acitivy.你可以多测试几次看看,这个问题是不是在100%重现