用Android-Studio的IntentService模板快速实现业务需求(实战)
2016-08-21 22:32
465 查看
一、用Android-Studio开发工具,新建一个IntentService。
二、勾选“开始方法助手”,其实就是IntentService的模板写法。
三、详细看下模板内容。
第一:四个私有的、静态的和最终的常量。两个用来Action标识,两个用来参数标识。
题外话:为什么用ACTION_FOO,ACTION_BAZ来标识两个动作。FOO与BRZ的含义是什么?
答案的网址:https://en.wikipedia.org/wiki/Foobar ;
第二:有startActionFoo,startActionBaz,来分别启动不同的Service。
启动Service的时候,顺便传参EXTRA_PARAM1,EXTRA_PARAM2,
第三:核心就是onHandleIntent,方法intent不为null,同时取得的匹配则调用相应的方法handleActionFoo,handleActionBaz。
四、实战IntentService。
业务需求:在Service里开启次线程请求网络数据,将返回的数据通过广播(Broadcast)传给活动(Activity),更新UI视图。
IntentService+Thread+Broadcast+Activity。
根据官方提供的模板,填写自己的类。
(1)自定义IntentService类:
(2)Activity:
实现效果图:
新闻接口:http://api.1-blog.com/biz/bizserver/news/list.do ;
博主认为还需改进的地方就是启动服务的方法在Service里设置则需要设置为static的,这样在Activity中要启动Service则需要[类名].[方法名],耦合姓太高。
建议讲启动Service的方法定义在Activity中。
二、勾选“开始方法助手”,其实就是IntentService的模板写法。
三、详细看下模板内容。
package com.czz.manager.service; import android.app.IntentService; import android.content.Intent; import android.content.Context; /** * An {@link IntentService} subclass for handling asynchronous task requests in * a service on a separate handler thread. * <p> * TODO: Customize class - update intent actions, extra parameters and static * helper methods. */ public class MyIntentService extends IntentService { // TODO: Rename actions, choose action names that describe tasks that this // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS private static final String ACTION_FOO = "com.czz.manager.service.action.FOO"; private static final String ACTION_BAZ = "com.czz.manager.service.action.BAZ"; // TODO: Rename parameters private static final String EXTRA_PARAM1 = "com.czz.manager.service.extra.PARAM1"; private static final String EXTRA_PARAM2 = "com.czz.manager.service.extra.PARAM2"; public MyIntentService() { super("MyIntentService"); } /** * Starts this service to perform action Foo with the given parameters. If * the service is already performing a task this action will be queued. * * @see IntentService */ // TODO: Customize helper method public static void startActionFoo(Context context, String param1, String param2) { Intent intent = new Intent(context, MyIntentService.class); intent.setAction(ACTION_FOO); intent.putExtra(EXTRA_PARAM1, param1); intent.putExtra(EXTRA_PARAM2, param2); context.startService(intent); } /** * Starts this service to perform action Baz with the given parameters. If * the service is already performing a task this action will be queued. * * @see IntentService */ // TODO: Customize helper method public static void startActionBaz(Context context, String param1, String param2) { Intent intent = new Intent(context, MyIntentService.class); intent.setAction(ACTION_BAZ); intent.putExtra(EXTRA_PARAM1, param1); intent.putExtra(EXTRA_PARAM2, param2); context.startService(intent); } @Override protected void onHandleIntent(Intent intent) { if (intent != null) { final String action = intent.getAction(); if (ACTION_FOO.equals(action)) { final String param1 = intent.getStringExtra(EXTRA_PARAM1); final String param2 = intent.getStringExtra(EXTRA_PARAM2); handleActionFoo(param1, param2); } else if (ACTION_BAZ.equals(action)) { final String param1 = intent.getStringExtra(EXTRA_PARAM1); final String param2 = intent.getStringExtra(EXTRA_PARAM2); handleActionBaz(param1, param2); } } } /** * Handle action Foo in the provided background thread with the provided * parameters. */ private void handleActionFoo(String param1, String param2) { // TODO: Handle action Foo throw new UnsupportedOperationException("Not yet implemented"); } /** * Handle action Baz in the provided background thread with the provided * parameters. */ private void handleActionBaz(String param1, String param2) { // TODO: Handle action Baz throw new UnsupportedOperationException("Not yet implemented"); } }
第一:四个私有的、静态的和最终的常量。两个用来Action标识,两个用来参数标识。
题外话:为什么用ACTION_FOO,ACTION_BAZ来标识两个动作。FOO与BRZ的含义是什么?
答案的网址:https://en.wikipedia.org/wiki/Foobar ;
第二:有startActionFoo,startActionBaz,来分别启动不同的Service。
启动Service的时候,顺便传参EXTRA_PARAM1,EXTRA_PARAM2,
第三:核心就是onHandleIntent,方法intent不为null,同时取得的匹配则调用相应的方法handleActionFoo,handleActionBaz。
四、实战IntentService。
业务需求:在Service里开启次线程请求网络数据,将返回的数据通过广播(Broadcast)传给活动(Activity),更新UI视图。
IntentService+Thread+Broadcast+Activity。
根据官方提供的模板,填写自己的类。
(1)自定义IntentService类:
package com.czz.manager.service; import android.app.IntentService; import android.content.Intent; import android.content.Context; import com.czz.manager.bean.NewsInfo; import com.czz.manager.bean.WeatherInfo; import java.util.ArrayList; public class TestIntentService extends IntentService { //TODO :①定义ACTION常量,action_news和action_weather,即“新闻”和“天气” private static final String ACTION_NEWS = "com.czz.manager.service.action.NEWS"; private static final String ACTION_WEATHER = "com.czz.manager.service.action.WEATHER"; //TODO :②启动Service,需要传一些参数 private static final String EXTRA_PARAM1 = "com.czz.manager.service.extra.PARAM1"; private static final String EXTRA_PARAM2 = "com.czz.manager.service.extra.PARAM2"; //TODO :③获得结果之后需要用Broadcast将结果发送给Activity以更新UI视图 private static final String NEWS_RESULT = "com.czz.manager.service.RESULT.NEWS"; private static final String WEATHER_RESULT = "com.czz.manager.service.RESULT.WEATHER"; //TODO :④发送广播,需要传入的一些参数 private static final String EXTRA_PARAM3 = "com.czz.manager.service.extra.PARAM3"; private static final String EXTRA_PARAM4 = "com.czz.manager.service.extra.PARAM4"; public TestIntentService() { super("TestIntentService"); } public static void startActionNEWS(Context context, String param1, String param2) { Intent intent = new Intent(context, TestIntentService.class); intent.setAction(ACTION_NEWS); intent.putExtra(EXTRA_PARAM1, param1); intent.putExtra(EXTRA_PARAM2, param2); context.startService(intent); } public static void startActionWEATHER(Context context, String param1, String param2) { Intent intent = new Intent(context, TestIntentService.class); intent.setAction(ACTION_WEATHER); intent.putExtra(EXTRA_PARAM1, param1); intent.putExtra(EXTRA_PARAM2, param2); context.startService(intent); } @Override protected void onHandleIntent(Intent intent) { if (intent != null) { final String action = intent.getAction(); if (ACTION_NEWS.equals(action)) { final String param1 = intent.getStringExtra(EXTRA_PARAM1); final String param2 = intent.getStringExtra(EXTRA_PARAM2); handleActionNEWS(param1, param2); } else if (ACTION_WEATHER.equals(action)) { final String param1 = intent.getStringExtra(EXTRA_PARAM1); final String param2 = intent.getStringExtra(EXTRA_PARAM2); handleActionWEATHER(param1, param2); } } } private void handleActionNEWS(String param1, String param2) { //次线程里操作网络请求数据 new Thread(new Runnable() { @Override public void run() { ArrayList<NewsInfo> arrayList = getNews(); Intent intent = new Intent(NEWS_RESULT); // cd17 此处传送的数据的是集合类型,也可以有其他的类型:intent.put intent.putParcelableArrayListExtra(EXTRA_PARAM3, arrayList); sendBroadcast(intent); } }).start(); } private void handleActionWEATHER(String param1, String param2) { //次线程里操作网络请求数据 new Thread(new Runnable() { @Override public void run() { ArrayList<WeatherInfo> arrayList = getWeather(); Intent intent = new Intent(WEATHER_RESULT); // 此处传送的数据的是集合类型 intent.putParcelableArrayListExtra(EXTRA_PARAM4, arrayList); sendBroadcast(intent); } }).start(); } private ArrayList<WeatherInfo> getWeather() { ArrayList<WeatherInfo> list=null; // 从网络上的JSON数据转为集合,可以是[retrofit2]框架异步操作 // ... return list; } private ArrayList<NewsInfo> getNews() { ArrayList<NewsInfo> list=null; // 从网络上的JSON数据转为集合 // ... return list; } }
(2)Activity:
package com.czz.manager.service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.czz.manager.R; import com.czz.manager.bean.NewsInfo; import com.czz.manager.bean.WeatherInfo; import java.util.ArrayList; public class TestActivity extends AppCompatActivity { //TODO :③获得结果之后需要用Broadcast将结果发送给Activity以更新UI视图 private static final String NEWS_RESULT = "com.czz.manager.service.RESULT.NEWS"; private static final String WEATHER_RESULT = "com.czz.manager.service.RESULT.WEATHER"; //TODO :④发送广播,需要传入的一些参数 private static final String EXTRA_PARAM3 = "com.czz.manager.service.extra.PARAM3"; private static final String EXTRA_PARAM4 = "com.czz.manager.service.extra.PARAM4"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); //注册广播,以接收Service通过广播发送过来的数据 registerReceiver(); //启动服务 TestIntentService.startActionNEWS(this, null, null); TestIntentService.startActionWEATHER(this, null, null); } private void registerReceiver() { IntentFilter filter = new IntentFilter(); //区分多种广播 filter.addAction(NEWS_RESULT); filter.addAction(WEATHER_RESULT); registerReceiver(receiver, filter); } private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(NEWS_RESULT)) { Log.i("mylog", "NEWS广播接收器中..."); ArrayList<NewsInfo> arrayList = intent.getParcelableArrayListExtra(EXTRA_PARAM3); //获取到了数据,进行一些UI更新... } else if (intent.getAction().equals(WEATHER_RESULT)) { Log.i("mylog", "WEATHER广播接收器中..."); ArrayList<WeatherInfo> arrayList = intent.getParcelableArrayListExtra(EXTRA_PARAM4); //获取到了数据,进行一些UI更新... } } }; @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } } (3)JavaBean: 此处给出NewsInfo类,Weather类省略。需要实现Parcelable接口 package com.czz.manager.bean; import android.os.Parcel; import android.os.Parcelable; /** * Created by XiuChou on 2016/8/19 */ public class NewsInfo implements Parcelable { public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeString(article_url); out.writeString(behot_time); out.writeInt(bury_count); out.writeInt(digg_count); out.writeInt(repin_count); out.writeInt(create_time); out.writeInt(publish_time); out.writeString(source); out.writeString(title); } public static final Parcelable.Creator<NewsInfo> CREATOR = new Parcelable.Creator<NewsInfo>() { public NewsInfo createFromParcel(Parcel in) { return new NewsInfo(in); } public NewsInfo[] newArray(int size) { return new NewsInfo[size]; } }; private NewsInfo(Parcel in) { article_url = in.readString(); behot_time = in.readString(); bury_count = in.readInt(); digg_count = in.readInt(); repin_count = in.readInt(); create_time = in.readInt(); publish_time = in.readInt(); source = in.readString(); title = in.readString(); } private String article_url;//Http,Url private String behot_time;//时间 private int bury_count;//踩数 private int digg_count;//点赞数 private int repin_count;//收藏数 private int create_time;//创建时间 private String group_id; private int publish_time;//发布时间 private String source;//来源 private String title;//新闻标题 public int getCreate_time() { return create_time; } public int getDigg_count() { return digg_count; } public String getGroup_id() { return group_id; } public int getPublish_time() { return publish_time; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public int getRepin_count() { return repin_count; } public void setRepin_count(int repin_count) { this.repin_count = repin_count; } public void setPublish_time(int publish_time) { this.publish_time = publish_time; } public void setGroup_id(String group_id) { this.group_id = group_id; } public void setDigg_count(int digg_count) { this.digg_count = digg_count; } public void setCreate_time(int create_time) { this.create_time = create_time; } public int getBury_count() { return bury_count; } public void setBury_count(int bury_count) { this.bury_count = bury_count; } public String getArticle_url() { return article_url; } public void setArticle_url(String article_url) { this.article_url = article_url; } public String getBehot_time() { return behot_time; } public void setBehot_time(String behot_time) { this.behot_time = behot_time; } @Override public String toString() { return "NewsInfo{" + "article_url='" + article_url + '\'' + ", behot_time='" + behot_time + '\'' + ", bury_count=" + bury_count + ", digg_count=" + digg_count + ", repin_count=" + repin_count + ", create_time=" + create_time + ", group_id='" + group_id + '\'' + ", publish_time=" + publish_time + ", source='" + source + '\'' + ", title='" + title + '\'' + '}'; } }
实现效果图:
新闻接口:http://api.1-blog.com/biz/bizserver/news/list.do ;
博主认为还需改进的地方就是启动服务的方法在Service里设置则需要设置为static的,这样在Activity中要启动Service则需要[类名].[方法名],耦合姓太高。
建议讲启动Service的方法定义在Activity中。
相关文章推荐
- Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- AndroidStudio插件GsonFormat快速实现JavaBean
- Android Studio 快速找到SDK中实现抽象类的子类
- Android实战 - 音心播放器 (Music Service 实现)
- APP开发实战149-Android Studio模板的定制使用
- android IntentService实现原理及内部代码分享
- AndroidStudio插件GsonFormat快速实现JavaBean
- 对CompletionService封装,实现快速处理业务任务并汇总结果
- AndroidStudio插件GsonFormat快速实现JavaBean
- 如何快速分析一款ios软件或需求的大流程,然后在业务层实现,不牵扯到界面?
- Android studio多个项目之间怎么实现快速切换?
- 【Android】android studio一键生成快速开发实现语言国际化
- Android----->多线程的实现Thread、IntentService的运用
- AndroidStudio插件GsonFormat快速实现JavaBean
- android studio一键生成快速开发实现语言国际化
- AndroidStudio子类快速实现未实现的方法-快捷键
- AndroidStudio插件GsonFormat快速实现JavaBean
- AndroidStudio插件GsonFormat快速实现JavaBean
- Android Studio快速插入模板代码
- Android实战 - 音心播放器 (优化Service退出,按两下退出应用实现)