这里运用到的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(安卓)实现联网(四)——TCP/UDP
  2. Android怎么快速建立TCP连接
  3. Android(安卓)使用Post方式提交数据
  4. Android学习之Android中Http通信:Http协议
  5. Android(安卓)客户端与服务器端进行数据交互(二、登录客户端)
  6. Handler、Looper与MessageQueue源码分析
  7. Android消息处理机制(Handler、Looper、MessageQueue与Message)
  8. Android(安卓)Handler 深入学习(2)
  9. Android应用程序键盘(Keyboard)消息处理机制分析(6)

随机推荐

  1. Android事件总线 浅谈 EventBus
  2. Android(安卓)SurfaceView的使用
  3. AndroidPN测试(Android Push Notification
  4. AndroidTimer使用(二)
  5. Ubuntu下配置Android
  6. @和?的区别
  7. Xamarin 2.0编译报错缺少Google Maps Lib
  8. Android第四十二期 - 关于微信手势退出Ac
  9. Android开发文档——Notifications
  10. 使用kotlin开发android