Android Service学习之IntentServi…

IntentService是一个处理异步请求的Service,它在一个工作线程中依次处理Intent,不阻塞主线程。当所有工作完成后,IntentService会自动停止。在创建时,IntentService会启动一个Handler线程,并在onStart()时将Intent放入Message队列,通过onHandleIntent(Intent)进行具体业务处理。适合用于执行单一任务然后结束的场景,如下载任务。
什么是IntentService? (本文转自 http://android.blog.51cto.com/268543/528166

官方的解释是:
IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through android.content.Context.startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
意思是说:IntentService是一个通过 Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的 onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求.(**本人修改了原文的一些翻译)

下面是要分析的源码:
public abstract class IntentService extends Service {

                private volatile Looper mServiceLooper;
        private volatile ServiceHandler mServiceHandler;

                private String mName;
        private boolean mRedelivery;
     

                private final class ServiceHandler extends Handler {

                                public ServiceHandler(Looper looper) {
                        super(looper);
                }
     
                @Override
                public void handleMessage(Message msg) {
                        onHandleIntent((Intent)msg.obj);
                        stopSelf(msg.arg1);
                }

                }
从源码可以分析出:
IntentService 实际上是Looper,Handler,Service 的集合体,他不仅有服务的功能,还有处理和循环消息的功能.

下面是onCreate()的源码:
                @Override
                public void onCreate() {
                                super.onCreate();

                                HandlerThread thread = new HandlerThread( "IntentService[" + mName + "]");
                                thread.start();

                                mServiceLooper = thread.getLooper();
                                mServiceHandler = new ServiceHandler(mServiceLooper);
                }
分析:IntentService创建时就会创建Handler线程(HandlerThread)并且启动,然后再得到当前线程的Looper对象来初始化IntentService的mServiceLooper,接着创建mServicehandler对象.

下面是onStart()的源码:
                @Override
                public void onStart(Intent intent, int startId) {
                                Message msg = mServiceHandler.obtainMessage();
                                msg.arg1 = startId;
                                msg.obj = intent;

                                mServiceHandler.sendMessage(msg);
                }
分析:当你启动IntentService的时候,就会产生一条附带startId和Intent的Message并发送到MessageQueue中,接下来Looper发现MessageQueue中有Message的时候,就会停止Handler处理消息,接下来处理的代码如下:
                @Override
                public void handleMessage(Message msg) {
                                                onHandleIntent((Intent)msg.obj);
                                                stopSelf(msg.arg1);
                }
接着调用 onHandleIntent((Intent)msg.obj),这是一个抽象的方法,其实就是我们要重写实现的方法,我们可以在这个方法里面处理我们的工作.当任务完成时就会调用stopSelf(msg.arg1)这个方法来结束指定的工作.

当所有的工作执行完后:就会执行onDestroy方法,源码如下:
                @Override
                public void onDestroy() {
                                mServiceLooper.quit();
                }
服务结束后调用这个方法 mServiceLooper.quit()使looper停下来.


通过对源码的分析得出:
    这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候接着得到Intent对象通过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出.
<think>我们正在寻找替代大量使用` `来实现文本对齐的优雅方法。根据引用[1][2][3]的内容,过度使用` `可能导致布局问题,尤其是在响应式设计中。引用[4]提到了使用Flexbox布局的`align-content`属性,但这里我们更关注水平对齐问题。 优雅的替代方案: 1. 使用CSS的Flexbox布局:可以轻松实现元素的对齐,无需使用` `。 2. 使用CSS Grid布局:同样可以精确控制元素位置。 3. 使用text-align属性:对于文本对齐,使用text-align更合适。 4. 使用margin和padding:通过调整间距实现对齐。 5. 使用伪元素:在某些情况下,可以用伪元素来添加间隔。 具体到问题中的代码,原代码中使用了多个` `来分隔指令ID、类型和按钮。我们可以通过CSS布局来重构,避免使用` `。 重构步骤: 1. 将指令信息(ID和类型)和操作按钮(暂停、删除)分别放入两个容器中。 2. 使用Flexbox布局,让这两个容器分别占据左右两侧。 3. 在左侧信息容器内,也可以使用Flex布局来设置ID和类型的间距。 代码示例: 原代码结构(简化): ```html <div class="instruction-info"> <span class="cmd-id"> {{ cmd.id }}</span>         <span class="cmd-type">{{ cmd.type }}</span>        <el-button ...>暂停</el-button> <el-button ...>删除</el-button> </div> ``` 重构后: ```html <div class="instruction-info"> <div class="info-left"> <span class="cmd-id">{{ cmd.id }}</span> <span class="cmd-type">{{ cmd.type }}</span> </div> <div class="info-right"> <el-button ...>暂停</el-button> <el-button ...>删除</el-button> </div> </div> ``` 样式: ```css .instruction-info { display: flex; justify-content: space-between; /* 左右两侧分开 */ align-items: center; /* 垂直居中 */ } .info-left { display: flex; gap: 20px; /* 使用gap属性设置子元素之间的间距 */ } .info-right { display: flex; gap: 10px; /* 按钮之间的间距 */ } ``` 这样,我们完全移除了` `,使用Flex布局的gap属性(或者margin)来控制间距,更加清晰和易于维护。 另外,根据引用[3]提到的,在表格对齐等场景中,如果确实需要空格,可以考虑使用` `作为占位,但布局场景中应优先使用CSS。 总结:使用CSS布局技术(Flexbox或Grid)替代` `进行对齐是更优雅、更可维护的方式。 相关问题: 1. 在响应式设计中,如何调整Flexbox布局以适应不同屏幕尺寸? 2. 除了Flexbox,CSS Grid在实现复杂布局时有哪些优势? 3. 如何解决Flexbox布局中的浏览器兼容性问题? 4. 在文本排版中,如何实现首行缩进、段落间距等效果而不使用` `或` `?</think># 优雅的文本对齐方案:替代大量 的CSS布局方法 在HTML中使用大量` `来实现对齐不仅代码臃肿,还会导致维护困难和响应式问题。下面我将介绍几种更优雅的CSS替代方案。 ## 问题分析 使用` `的常见问题: - 代码可读性差,难以维护 - 无法适应不同屏幕尺寸 - 间距控制不精确 - 不利于响应式设计 ## 优雅的CSS替代方案 ### 1. Flexbox布局(推荐) ```html <div class="flex-container"> <div class="label">指令ID:</div> <div class="value">CMD-2023-001</div> <div class="label">类型:</div> <div class="value">类型A</div> <div class="actions"> <button>暂停</button> <button>删除</button> </div> </div> <style> .flex-container { display: flex; align-items: center; /* 垂直居中 */ gap: 15px; /* 元素间距 */ } .label { font-weight: bold; min-width: 70px; /* 固定标签宽度 */ } .actions { margin-left: auto; /* 自动将按钮推到右侧 */ display: flex; gap: 10px; } </style> ``` ### 2. Grid布局(复杂布局首选) ```html <div class="grid-container"> <div class="label">指令ID:</div> <div class="value">CMD-2023-001</div> <div class="label">类型:</div> <div class="value">类型A</div> <div class="actions"> <button>暂停</button> <button>删除</button> </div> </div> <style> .grid-container { display: grid; grid-template-columns: auto 1fr auto 1fr auto; /* 5列布局 */ align-items: center; gap: 15px; } .actions { grid-column: 5; /* 将按钮放在最后一列 */ display: flex; justify-content: flex-end; /* 右对齐 */ gap: 10px; } </style> ``` ### 3. 伪元素实现等宽间距 ```html <div class="spaced-container"> <span>指令ID: CMD-2023-001</span> <span>类型: 类型A</span> <div class="actions"> <button>暂停</button> <button>删除</button> </div> </div> <style> .spaced-container { display: flex; } .spaced-container > span:not(:last-child)::after { content: ""; display: inline-block; width: 30px; /* 自定义间距 */ } </style> ``` ### 4. 文本对齐与间距控制 ```css /* 替代   的文本对齐方案 */ .text-align-center { text-align: center; } .text-align-right { text-align: right; } /* 替代   的间距控制 */ .spacing-small { margin-right: 8px; } .spacing-medium { margin-right: 16px; } .spacing-large { margin-right: 24px; } ``` ## 实际应用示例 ```html <div class="command-card"> <div class="command-header"> <h3>任务标题</h3> </div> <div class="command-grid"> <div class="command-info"> <span class="label">指令ID:</span> <span class="value">CMD-2023-001</span> </div> <div class="command-info"> <span class="label">类型:</span> <span class="value">类型A</span> </div> <div class="command-actions"> <button class="btn-warning">暂停</button> <button class="btn-danger">删除</button> </div> </div> </div> <style> .command-card { border: 1px solid #e0e0e0; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .command-header { margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid #eee; } .command-grid { display: grid; grid-template-columns: 1fr 1fr auto; gap: 15px; align-items: center; } .command-info { display: flex; gap: 10px; } .label { font-weight: bold; min-width: 60px; } .command-actions { display: flex; justify-content: flex-end; gap: 10px; } .btn-warning { background: #ffc107; border: none; padding: 6px 12px; border-radius: 4px; cursor: pointer; } .btn-danger { background: #dc3545; color: white; border: none; padding: 6px 12px; border-radius: 4px; cursor: pointer; } </style> ``` ## 最佳实践建议 1. **优先使用Flexbox/Grid布局**:现代CSS布局技术提供了更强大的对齐能力[^4] 2. **使用gap属性控制间距**:替代` `创建元素间距 3. **利用margin/padding进行微调**:精确控制元素间距 4. **避免使用固定宽度**:使用min-width/max-width实现响应式设计 5. **使用CSS变量统一间距**: ```css :root { --spacing-sm: 8px; --spacing-md: 16px; --spacing-lg: 24px; } .element { margin-right: var(--spacing-md); } ``` 6. **在必须使用空格时**:考虑使用` `(1/6em)或` `(1/2em)替代` `[^2][^3] 通过这些CSS技术,您可以完全避免使用` `进行布局控制,创建更干净、更可维护且响应式的设计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值