【问题标题】:Which structure for my Android Application?我的 Android 应用程序采用哪种结构?
【发布时间】:2012-08-25 15:55:53
【问题描述】:

我做了很多研究,但我没有通过它,所以我不知道如何实现我的应用程序。该应用程序由 2 个以上的活动组成,其中包含应由后台服务更新的内容。所以我不知道如何进行连接,有人说我应该做 ipc,但其他人说那工作量太大,只要服务和活动在同一个进程中运行。我担心轻松创建像 ActivityOne.RefreshData(Data data) 这样的方法并在服务中调用这些方法,但直到现在我才设法让它工作。希望您对我有一些建议,并为我的英语不好感到抱歉!

干杯

【问题讨论】:

    标签: android service android-activity communication


    【解决方案1】:

    如果您只需要为自己的活动提供数据/更新,那么肯定不需要 IPC。

    为了实现这一点,我会反转您似乎描述的方向,而不是让服务调用 Activity 的方法,而是让它在/如果它启动时将消息推送到 Activity 提供给它的处理程序。

    见: http://developer.android.com/reference/android/os/Handler.html

    http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/

    请注意,如果您需要从服务发送到活动的始终是相同类型的对象,您可以通过使用 Message.obj 字段来保存您的类型来简化您的 handleMessage() 实现,而无需使用 Bundles 或打包。如:

    在 NotificationModel 是服务始终发送的类型的活动中的 Handler impl:

    private Handler mNotificationListener = new Handler(){
         @Override
          public void handleMessage(Message msg) {
             handleIncomingNotification((NotificationModel)msg.obj);
             }
        };
    

    将消息发送到此处理程序的服务端如下所示:

    public class NotificationRouter {
    
        private Application mContext;
        private SparseArray<Handler> mListeners = new SparseArray<Handler>();
    
        public NotificationRouter (Application app){
        this.mContext = app;
        }
    
        public void registerListener(Handler handler){
        mListeners.put(handler.hashCode(), handler);
        }
    
        public void unRegisterListener(Handler handler){
        mListeners.remove(handler.hashCode());
        }
    
        public void post(NotificationModel notice){
        Message m = new Message();
        m.obj = notice;
        for (int i = 0; i < mListeners.size(); i++){
            Handler h = mListeners.valueAt(i);
            h.sendMessage(m);
        }
        }
    }
    

    【讨论】:

    • 非常感谢您的回答,我会处理链接并希望取得一些成功
    • 我是否必须将处理程序从启动服务的活动传递给它自己通过 Intent 由 startService 传递的服务?
    • 不,当你的 Activity 启动服务时,它应该绑定到它,因此可以引用它来调用它的方法。因此,在绑定/启动服务之后,您的活动应该能够从上面的示例中调用 service.registerListener。
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2015-02-14
    • 2013-07-14
    • 1970-01-01
    • 2015-03-26
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多