2014-09-11 23 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

相關問題