2014-09-11 18 views
0

在Android开发中的新的和我必须做一个应用程序,检查在前台运行的应用程序,它应该更新与应用程序的名称的文本。在使用字符串的那一刻,因为我不能引用可运行内部类的非最终变量。textview重新设置每次我回到应用程序

我已将我的代码放入Runnable类中,放入我主要活动的oncreate方法中,不知道它是否是放置它的正确位置,因为我想运行一次,然后让该线程执行其工作一个无限循环。

我发现的几个问题之一是当我运行我的应用程序,每当我回到应用程序,textview是空的,然后线程开始填充它与我的字符串,但是当我离开应用程序和再次回来,是空的。

我该如何保持textview的内容?

我把我的代码放在这里,谢谢你的帮助。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (!bExecuted) 
    { 
     bExecuted = true; 

     setContentView(R.layout.activity_main); 

     final TextView myText = (TextView) this.findViewById(R.id.my_view); 
     final ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
     final PackageManager pm = this.getPackageManager(); 

     Runnable myRunnable = new Runnable() { 
      @Override 
      public void run() { 

       String foregroundTaskAppName = ""; 
       String foregroundTaskAppNameOld = ""; 

       while (true) 
       { 
        try 
        { 
         Thread.sleep(500); 
         // The first in the list of RunningTasks is always the foreground task. 
         RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); 

         String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName(); 

         PackageInfo foregroundAppPackageInfo; 

         foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0); 

         foregroundTaskAppNameOld = foregroundTaskAppName; 
         foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString(); 

         if (!foregroundTaskAppNameOld.equals(foregroundTaskAppName)) 
         { 
          myText.post(new Runnable() { 
           @Override 
           public void run() { 
            String textOld = (String)myText.getText(); 
            myText.setText(textOld + "hol\n"); 
           } 
          }); 
         } 

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

     Thread myThread = new Thread(myRunnable); 
     myThread.start(); 
    } 
} 
+0

如果你的意思是“回来”,你只是暂停你的应用程序,然后你必须在onRestart我也想这样做的东西。但是,如果关闭应用程序,则可以将最后一个字符串存储在sharedPreferences – Opiatefuchs 2014-09-11 09:56:47

回答

0

你需要的是正确的生命周期管理,活动进入暂停状态,当它被移出动作,你需要的是休闲娱乐的活动时,再次谈到。

由于您刚接触android,而不是提供已实现的代码,所以我建议您在Adnroid Developer这里阅读关于它的内容,这样您将了解更多信息,如果您甚至无法阅读建议的链接后,我知道我会帮助。

+0

中,例如“为了让Android系统恢复活动中视图的状态,每个视图都必须具有由android提供的唯一ID :id属性“。这意味着如果我的textview有一个ID我不必无所作为?谢谢 – takluiper 2014-09-11 10:22:23

+0

如果它有一个ID,android会恢复它。但要保留诸如对象和其他处理过的数据的值,则需要使用API​​S,例如saveInstanceState和restoreInstanceState。 – Techfist 2014-09-11 10:25:44

+0

我遇到了一个问题,当用户在平板电脑中简单按下时,不会调用onSaveInstanceState。我可以使用哪个事件& – takluiper 2014-09-11 11:05:42

0

一旦TextView被更改,它不会在应用程序被终止后保存。 你需要的是使用Android的保存状态,或者用这个:

save value: 
sharedpreferences sp = getSharedPreferences("Name Your data Base", Context.MODE_PRIVATE); 
sp.edit().putString("NameOfVar" , "value").commit(); 

load value: 
sharedpreferences sp = getSharedPreferences("Name Your data Base", Context.MODE_PRIVATE); 
String loadedValue = sp.getString("NameOfVar" , "Default Value"); 

祝您好运!

+0

无法在sharedpreferences中找到putString方法。感谢您的回答 – takluiper 2014-09-11 10:23:41

+0

对不起,它的sp.edit()。putString(“NameOfVar”,“value”)。commit(); – Fashizel 2014-09-14 12:33:05

相关问题