先贴我要通过service启动的activity的manifest里面的配置参数,这个activity是程序的启动函数,也就是入口函数            <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定义
            <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的的广播时发送命令的代码            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个问题,第一个对我来说比较难,希望高手能来解决下,谢谢指教了!

解决方案 »

  1.   

     it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);跟这个有关系吧? 为什么加这两句?
      

  2.   

    一般来说,在service中启动activity,只要设置这个就可以了Intent.FLAG_ACTIVITY_NEW_TASK。
    怀疑你的service又启动了一次这个acitivy.你可以多测试几次看看,这个问题是不是在100%重现
      

  3.   


    不加Intent.FLAG_ACTIVITY_CLEAR_TOP 我在外面重复的发广播的话(我从外面发广播就是想他重算,因为可能发过来的数据不一样。),检测到之前的testactivity并没有销毁,所以testactivity多次被创建,程序出现问题了。加Intent.FLAG_ACTIVITY_CLEAR_TOP就不会,是每次创建之前都清掉之前的activity   达到的就是我想要的效果,现在关键性的问题就是这样的,我下面描述下:我现在有3个程序,A,B,C  其中A的作用是负责启动C程序,A中有两种方法,第一种,直接启动C程序,通过下面的代码 Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
    intent.setComponent(new ComponentName("com.xxx.activity", 
    "com.xxx.activity.TestActivity"));

    startActivity(intent);
    通过这个启动起来的C程序完全没有问题,也能达到我想要的效果。A中的第二个方法是通过广播启动我C程序中的service,启动后帮我的C程序的初始化操作做掉(因为我C程序要正常使用其中的很多功能需要先初始化很多东西)。B程序的功能是发广播,广播中带有很多数据,C中有个广播接收器,接受到广播后会做一些运算,现在通过A的第一个功能直接启动的,B传一些数据去C中C处理所有的逻辑达到的是我的要求就是我每次传数据过去,C都会运算,然后后台,再从后台把C调出来数据也都还在,
    但是,我通过A的第二个方法,启动service后先帮C中初始化操作,但入口函数的那个activity不显示出来(第一个方式是入口的activity和初始化同步进行,就是activity立刻显示出来),在我B传数据过去,C显示出来并且做计算,B第一次穿数据过去(假设这个数据是x),运算正常。可是这时C后台,然后从后台调出来,他不是恢复后台前的那些状态,而是从新计算一次,并且数据是x,每次后台然后调出来都恢复不了后台操作前的状态,都要用数据x从新计算一遍,这个是怎么回事?甚至我退出程序C,再通过按住home键启动C软件,一开始打开界面还是会用x数据计算一次。
    说的很多,不知道我说明白没有,真的很急,弄了2天了,没有头绪,如果您稍微有点空,就麻烦您把上面的仔细读下,因为我怕我描述的不够清楚。求解释,求怎么解决。谢谢了!
      

  4.   


    不加Intent.FLAG_ACTIVITY_CLEAR_TOP 我在外面重复的发广播的话(我从外面发广播就是想他重算,因为可能发过来的数据不一样。),检测到之前的testactivity并没有销毁,所以testactivity多次被创建,程序出现问题了。加Intent.FLAG_ACTIVITY_CLEAR_TOP就不会,是每次创建之前都清掉之前的activity   达到的就是我想要的效果,现在关键性的问题就是这样的,我下面描述下:我现在有3个程序,A,B,C  其中A的作用是负责启动C程序,A中有两种方法,第一种,直接启动C程序,通过下面的代码 Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
    intent.setComponent(new ComponentName("com.xxx.activity", 
    "com.xxx.activity.TestActivity"));

    startActivity(intent);
    通过这个启动起来的C程序完全没有问题,也能达到我想要的效果。A中的第二个方法是通过广播启动我C程序中的service,启动后帮我的C程序的初始化操作做掉(因为我C程序要正常使用其中的很多功能需要先初始化很多东西)。B程序的功能是发广播,广播中带有很多数据,C中有个广播接收器,接受到广播后会做一些运算,现在通过A的第一个功能直接启动的,B传一些数据去C中C处理所有的逻辑达到的是我的要求就是我每次传数据过去,C都会运算,然后后台,再从后台把C调出来数据也都还在,
    但是,我通过A的第二个方法,启动service后先帮C中初始化操作,但入口函数的那个activity不显示出来(第一个方式是入口的activity和初始化同步进行,就是activity立刻显示出来),在我B传数据过去,C显示出来并且做计算,B第一次穿数据过去(假设这个数据是x),运算正常。可是这时C后台,然后从后台调出来,他不是恢复后台前的那些状态,而是从新计算一次,并且数据是x,每次后台然后调出来都恢复不了后台操作前的状态,都要用数据x从新计算一遍,这个是怎么回事?甚至我退出程序C,再通过按住home键启动C软件,一开始打开界面还是会用x数据计算一次。
    说的很多,不知道我说明白没有,真的很急,弄了2天了,没有头绪,如果您稍微有点空,就麻烦您把上面的仔细读下,因为我怕我描述的不够清楚。求解释,求怎么解决。谢谢了!
      

  5.   

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    activity C同时lunchmode 设置成single instance
      

  6.   

    解决了,换了一个方法,没有再这个flag上着手了。难。你这个解决不了,