2013-03-08 36 views
1

成为空我已经声明了一个服务文件(backgroundService.java)内的静态的ArrayList变量。一旦我收到推送消息(使用GCM),我正在更新静态变量。我正在使用4.0.4设备(三星S3)..静态变量变空,一旦我的应用程序去背景,然后如果我长按memu按钮,并刷我的应用程序(一旦我们刷卡的应用程序正在完成,但不是强制停止),服务暂停一段时间,然后再次启动,即不调用服务onDestroy方法,而是OnCreate方法在该暂停后。暂停后,静态ArrayList变为空。如何解决它?我不希望我的静态ArrayList中失去它的价值。只有4.0+设备在Android的版本出现安卓:静态的ArrayList在服务

此问题。

public class BackgroundService extends Service 

private Timer timer = new Timer();

Context mContext; 

String LOG_TAG=BackgroundService.class.getSimpleName(); 
    ApplicationInfo ai; 
    private static boolean isRunning = false; 
public static ArrayList<String> mDMPush=new ArrayList<String>(); 

@Override 
public void onCreate() 
{ 
     super.onCreate(); 
     Log.e(LOG_TAG,"on create "); 
     isRunning = true; 


} 


@Override 
public void onStart(Intent intent, int startId) { 

    super.onStart(intent, startId); 


    Log.e(LOG_TAG,"mDMPush"+mDMPush); 

    Log.e(LOG_TAG,"mDMPush outside if else "+mDMPush.size()+" "+mDMPush.isEmpty()); 
      startService(); 



} 

public static boolean isRunning() 
{ 
    return isRunning; 
} 

private void startService() 
{   
    int delay = 100; 
    int period =500; 
final PackageManager pm = getPackageManager(); 

    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() 
     { 

     ActivityManager am = (ActivityManager) mContext.getSystemService(Activity.ACTIVITY_SERVICE); 
     String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName(); 
     try { 
       ai = pm.getApplicationInfo(packageName, 0); 
       if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 


         **Iam doing an action inside this timer using that arraylist mDMPush.. I ll add value to the arraylist once i received a push***    

       } 
      } catch (NameNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



     } 
    }, delay, period); 

} 
+0

为什么要使用一个静态的? – smk 2013-03-08 05:36:44

+0

发布你的活动代码与静态arraylist声明和使用。 – Prateek 2013-03-08 05:38:56

+0

因为基于静态arraylist值,我在后台做了一个动作。 – Sudarshan 2013-03-08 05:40:04

回答

0

这个你怎么也得保存在持久性存储阵列列表

Set<String> localStore = new HashSet<String>(); 
      List<String> list = new ArrayList<String>(); 
    localStore.addAll(list); 
    SharedPreferences ssidPref = getSharedPreferences("ssidPref", Context.MODE_PRIVATE); 
       SharedPreferences.Editor EDITIOR = ssidPref.edit(); 
       EDITIOR.putStringSet("ssidStored", localStore); 
       EDITIOR.commit(); 

阅读

localStore = ssidPref.getStringSet("ssidStored", null); 
+0

如果这解决了你的问题?? – DjHacktorReborn 2013-03-08 05:55:57

+0

我有一个疑问,在这个代码..我会动态改变我的ArrayList,即一旦我收到一推我会改变根据it..How我的ArrayList在那种情况下 – Sudarshan 2013-03-08 06:01:56

+0

该代码使用这个告诉你如何保存数组列表在持久性存储,所以你必须检查是否收到推送,并从上次更新价值变动老 – DjHacktorReborn 2013-03-08 06:03:42

0

看起来像你应用程序正在被杀死和重新创建,这是Android上的一个正常的事情。你不应该依赖一个静态状态,将它保存到像首选项或db这样的更持久的存储中。