我在收到通知时尝试更新FirstActivity
中的用户界面,但却被runOnUiThread
,Runnable
和Handler
混淆了。这就是我所拥有的:我正在运行FirstActivity和NotificationService。当NotificationService收到通知时,它将更新FirstActivity UI。
我还有另一项服务AlarmService
在运行。
第一项活动
@Override
public void onResume() {
super.onResume();
//some other code for alarm service
}
NotificationService
//on receiving notification
private void showNotification(String text) {
//Get activity
Class<?> activityClass = null;
try {
activityClass = Class.forName("com.pakage.FirstActivity");
contextActivity = (Activity) activityClass.newInstance();
//Update UI on FirstActivity not working
contextActivity.runOnUiThread(new Runnable() {
public void run()
{
Looper.prepare();
TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest);
Looper.loop();
}
});
} catch (Exception e) {
e.printStackTrace();
}
//Shows the notification
Notification n = new Notification();
//... etc
}
我一直在搞定looper.prepare错误。我是否需要在FirstActivity中添加额外的代码?
答案 0 :(得分:6)
我的第一直觉是你应该让Activity绑定到你的服务并处理它的更新,而不是直接修改Activity的服务。
在此处查看更多信息:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
这里有一个例子:
Example: Communication between Activity and Service using Messaging
答案 1 :(得分:5)
我一直只是通过广播启动服务然后在我的活动中我有一个BroadcastReciever正在收听广播。这种方法比上面概述的方法简单得多。
答案 2 :(得分:0)
我不知道你为什么要把Looper放进去
contextActivity.runOnUiThread(new Runnable() {
public void run()
{
Looper.prepare();
TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest);
Looper.loop();
}
});
因为UI(主)线程已经有一个Looper / Handler等..
即使它确实有效Looper.loop()
也会阻止,因为你在UI线程上运行它,它将阻止你不想要的UI线程。
你真正想做的是
contextActivity.runOnUiThread(new Runnable() {
public void run()
{
TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest);
tv.setText("do something that must be on UI thread") // or whatever
}
});
你真的不需要做所有这些花哨的东西来获得活动
activityClass = Class.forName("com.pakage.FirstActivity");
contextActivity = (Activity) activityClass.newInstance();
假设Service和Activity都在同一个进程中运行,你可以保存对Activity的引用,但是当Activity被销毁时要小心更新引用。