这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架

android项目中,有时会有这样一种需求:客户每隔一段时间,就像服务器发送一个请求,以获取某些重要的、实时更新的消息。比如天气预报。

如何让应用实现在后台一直处于运行状态,并且每个一段时间就向服务器发一个请求?android里的四大组件之一:服务,就为我们提供了这种功能。

因此,我们可以尝试在服务里边定义一个线程,只要服务不停止,线程就一直在运行,让它每隔一段时间,就向服务器发送一个请求。

我们来看一下核心代码

1.在Activity中,我们可以通过startService()来启动服务

public void open(View view) {Intent intent = new Intent(this, PushSmsService.class);// 启动服务startService(intent);}

2.这里我们需要自定义一个服务类,去继承android的Service类

/** *  * 短信推送服务类,在后台长期运行,每个一段时间就向服务器发送一次请求 *  * @author jerry *  */public class PushSmsService extends Service {private MyThread myThread;private NotificationManager manager;private Notification notification;private PendingIntent pi;private AsyncHttpClient client;private boolean flag = true;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {System.out.println("oncreate()");this.client = new AsyncHttpClient();this.myThread = new MyThread();this.myThread.start();super.onCreate();}@Overridepublic void onDestroy() {this.flag = false;super.onDestroy();}private void notification(String content, String number, String date) {// 获取系统的通知管理器manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);notification = new Notification(R.drawable.ic_menu_compose, content,System.currentTimeMillis());notification.defaults = Notification.DEFAULT_ALL; // 使用默认设置,比如铃声、震动、闪灯notification.flags = Notification.FLAG_AUTO_CANCEL; // 但用户点击消息后,消息自动在通知栏自动消失notification.flags |= Notification.FLAG_NO_CLEAR;// 点击通知栏的删除,消息不会依然不会被删除Intent intent = new Intent(getApplicationContext(),ContentActivity.class);intent.putExtra("content", content);intent.putExtra("number", number);intent.putExtra("date", date);pi = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);notification.setLatestEventInfo(getApplicationContext(), number+ "发来短信", content, pi);// 将消息推送到状态栏manager.notify(0, notification);}private class MyThread extends Thread {@Overridepublic void run() {String url = "http://110.65.99.66:8080/jerry/PushSmsServlet";while (flag) {System.out.println("发送请求");try {// 每个10秒向服务器发送一次请求Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}// 采用get方式向服务器发送请求client.get(url, new AsyncHttpResponseHandler() {@Overridepublic void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {try {JSONObject result = new JSONObject(new String(responseBody, "utf-8"));int state = result.getInt("state");// 假设偶数为未读消息if (state % 2 == 0) {String content = result.getString("content");String date = result.getString("date");String number = result.getString("number");notification(content, number, date);}} catch (Exception e) {e.printStackTrace();}}@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {Toast.makeText(getApplicationContext(), "数据请求失败", 0).show();}});}}}}


注意我们要在清单文件中注册Service

 <service android:name=".PushSmsService"></service>

由于通知信息使用到了手机的震动功能和网络访问,所以需要配置权限

    <uses-permission android:name="android.permission.VIBRATE"/>    <uses-permission android:name="android.permission.INTERNET"/>

我们再定义一个Activity,用于用户点击下拉通知栏里的某条消息后,跳转到详细的消息界面

public class ContentActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_content);Intent intent = getIntent();TextView tv_content = (TextView) this.findViewById(R.id.tv_content);TextView tv_number = (TextView) this.findViewById(R.id.tv_number);TextView tv_date = (TextView) this.findViewById(R.id.tv_date);if (intent != null) {String content = intent.getStringExtra("content");String number = intent.getStringExtra("number");String date = intent.getStringExtra("date");tv_content.setText("内容:" + content);tv_number.setText("号码:" + number);tv_date.setText("日期:" + date);}}}

同样,我们需要在清单文件中注册新的Activity

<activity android:name=".ContentActivity"></activity>

注意到上边的代码是需要服务器提供支持的,我们去新建一个简单的服务器,里边添加一个Servlet和一个实体类就可以了

public class PushSmsServlet extends HttpServlet {private static int index = 1;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println(index);// List<Sms> smsList = new ArrayList<Sms>();Sms sms = new Sms(index,"我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你" + index, "2013-03-03","13522224444");index++;// smsList.add(sms);// sms = new Sms(0, "我真的爱你", "2013-04-04", "13522224444");// smsList.add(sms);// sms = new Sms(1, "我真的真的爱你", "2013-05-05", "13522224444");// smsList.add(sms);response.setContentType("text/html");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();Gson gson = new Gson();// 将Sms类的数据转换为json数据格式String json = gson.toJson(sms);out.write(json);out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

再定义封装用于存放消息的类

public class Sms {private int state;private String content;private String date;private String number;public Sms(int state, String content, String date, String number) {super();this.state = state;this.content = content;this.date = date;this.number = number;}}

这里只贴出核心代码

源码下载请点击。。。。。


更多相关文章

  1. android 中定时器的几种写法
  2. Android中的网络管理源码分析--netd
  3. [置顶] Android基于XMPP Smack Openfire开发IM(5)发送消息
  4. Android(安卓)进阶10:进程通信之 Messenger 使用与解析
  5. Android多线程--Handler
  6. Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
  7. Android中桌面图标显示通知消息的数量
  8. Android学习笔记(38):Handler消息传递处理机制
  9. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)

随机推荐

  1. Android(安卓)EditText实现字符过滤
  2. Android 多个Activity选项卡实现
  3. android hook getdeceiveid
  4. Android中创建对话框
  5. Android(安卓)Stduio出现“required plug
  6. android ExpandableListView ExpandableL
  7. pandaboard ES学习之旅——4 Android源代
  8. Android 中文 API (29) ―― CompoundButto
  9. 跟着做 Android NDK学习入门如此简单(二)
  10. android数据存取的四种方式