【发布时间】:2023-08-05 21:14:01
【问题描述】:
我是 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();
}
}
【问题讨论】:
-
如果你的意思是“回来”,你只是暂停你的应用程序,那么我认为你也必须在 onRestart 中做这些事情。但是如果您关闭应用程序,您可以将最后一个字符串存储在 sharedPreferences 中
标签: android textview reset foreground