从服务更新UI(使用处理程序?)

时间:2011-10-29 22:26:24

标签: android user-interface service handler runnable

我在收到通知时尝试更新FirstActivity中的用户界面,但却被runOnUiThreadRunnableHandler混淆了。这就是我所拥有的:我正在运行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中添加额外的代码?

3 个答案:

答案 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被销毁时要小心更新引用。