Service是Android系统中提供的四大组件之一。它是运行在后台的一种服务,一般声明周期较长,不直接与用户进行交互。

  服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
    1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
    如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
    采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
    2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
    采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。
 
这里我采用了第一种方法启动 startService(new Intent(this, LocalService.class));不过首先需要在AndroidManifest.xml文件中注册声明我们新建的Service,在application标签内添加 <service android:name=".LocalService" />即可。
下面是实现的方法,开启新线程,每隔一分钟从服务器获取消息,若产生消息,则在手机状态栏通知该消息。
  1. public class LocalService extends Service {
  2. private static String info = null;
  3. private String TAG = "localservice";// 定义打印信息标识
  4. private NotificationManager mNM;// 定义状态栏通知
  5. private final IBinder mBinder = new LocalBinder();// 实例化LocalBinder
  6. // public static native void getSqlInfo();
  7. public class LocalBinder extends Binder {
  8. LocalService getService() {
  9. return LocalService.this;
  10. }
  11. }
  12. public IBinder onBind(Intent intent) {
  13. Log.i(TAG, "this is onBind");
  14. return mBinder;
  15. }
  16. // 实现创建方法
  17. public void onCreate() {
  18. Log.i(TAG, "this is onCreate");
  19. mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 获取通知栏管理器
  20. }
  21. // 实现开始方法
  22. public int onStartCommand(Intent intent, int flags, int startId) {
  23. Log.i(TAG, "received start id" + startId + ":" + intent);
  24. // 开启线程
  25. MessageThread messageThread = new MessageThread();
  26. messageThread.start();
  27. return START_STICKY;
  28. }
  29. // 实现销毁方法
  30. public void onDestory() {
  31. Log.i(TAG, "this is onDestory");
  32. mNM.cancel("qqq", 0);
  33. }
  34. // 实现解除bind方法
  35. public boolean onUnbind(Intent intent) {
  36. Log.i(TAG, "this is onUnbind");
  37. return super.onUnbind(intent);
  38. }
  39. private void showNotification(String serverMessage) {
  40. int icon = R.drawable.icon; // 通知图标
  41. CharSequence tickerText = "local sevice has started" + serverMessage; // 状态栏显示的通知文本提示
  42. long when = System.currentTimeMillis(); // 通知产生的时间,会在通知信息里显示
  43. // 用上面的属性初始化Nofification// 实例化状态通知
  44. Notification notification = new Notification(icon, tickerText, when);
  45. PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
  46. new Intent(this, HelloPush.class), 0);// 定义通知栏单击时间触发的intent
  47. notification.defaults |= Notification.DEFAULT_SOUND;// 添加声音
  48. // notification.defaults |= Notification.DEFAULT_VIBRATE;// 添加震动
  49. notification.defaults |= Notification.DEFAULT_LIGHTS;// 添加LED灯提醒
  50. notification.flags = Notification.FLAG_AUTO_CANCEL;// 在通知栏上点击此通知后自动清除此通知
  51. notification.setLatestEventInfo(this, "Local Service", tickerText,
  52. contentIntent);// 设置该状态栏通知消息的单击事件
  53. mNM.notify("qqq", 0, notification);// 通知栏显示该通知
  54. }
  55. /**
  56. * 从服务器端获取消息
  57. *
  58. */
  59. class MessageThread extends Thread {
  60. // 运行状态,下一步骤有大用
  61. public boolean isRunning = true;
  62. @SuppressLint("SimpleDateFormat")
  63. public void run() {
  64. System.out.println("running++++++++++++++");
  65. while (isRunning) {
  66. try {
  67. // 获取服务器消息
  68. String serverMessage = getServerMessage();
  69. SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
  70. Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
  71. String str = formatter.format(curDate);
  72. System.out.println("++++++++++++" + str);// &&str=="08:00"
  73. if (serverMessage != null && !"".equals(serverMessage)
  74. // &&"15:00".equalsIgnoreCase(str)
  75. ) {
  76. showNotification(serverMessage);
  77. }
  78. // 休息1分钟
  79. System.out.println("sleeping now+++++");
  80. Thread.sleep(60000);
  81. System.out.println("sleep ended+++++");
  82. } catch (InterruptedException e) {
  83. System.out.println("thread sleep error++++");
  84. e.printStackTrace();
  85. }
  86. }
  87. }
  88. }
  89. /**
  90. * @return 返回服务器要推送的消息,否则如果为空的话,不推送
  91. */
  92. public String getServerMessage() {
  93. System.out.println("getServerMessage++++++++");
  94. info = null;
  95. // getSqlInfo();
  96. // getSql();
  97. info = connecting();
  98. System.out.println("getServerMessage+++++++" + info);
  99. return info;
  100. }
  101. // public static int ReturnInfo(final String title) {
  102. // System.out.println("ReturnInfo+++++++++" + title);
  103. // info = title;
  104. // return 1;
  105. // }
  106. //
  107. // public void getSql() {
  108. // try {
  109. // String url = "jdbc:mysql://192.168.1.104:80/test";
  110. // String user = "root";
  111. // String pwd = "";
  112. //
  113. // // 加载驱动,这一句也可写为:Class.forName("com.mysql.jdbc.Driver");
  114. // Class.forName("com.mysql.jdbc.Driver").newInstance();
  115. // // 建立到MySQL的连接
  116. // Connection conn = DriverManager.getConnection(url, user, pwd);
  117. //
  118. // // 执行SQL语句
  119. // java.sql.Statement stmt = conn.createStatement();// 创建语句对象,用以执行sql语言
  120. // ResultSet rs = stmt.executeQuery("select * from push where id = 1");
  121. //
  122. // // 处理结果集
  123. // while (rs.next()) {
  124. // String name = rs.getString("name");
  125. // info = name;
  126. // System.out.println(name);
  127. // }
  128. // rs.close();// 关闭数据库
  129. // conn.close();
  130. // } catch (Exception ex) {
  131. // System.out.println("Error : " + ex.toString());
  132. // }
  133. // }
  134. public String connecting() {
  135. /* 存放http请求得到的结果 */
  136. String result = "";
  137. // String ss = null;
  138. String name = null;
  139. /* 将要发送的数据封包 */
  140. ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
  141. nameValuePairs.add(new BasicNameValuePair("id", "1"));
  142. InputStream is = null;
  143. // http post
  144. try {
  145. /* 创建一个HttpClient的一个对象 */
  146. HttpClient httpclient = new DefaultHttpClient();
  147. /* 创建一个HttpPost的对象 */
  148. HttpPost httppost = new HttpPost(
  149. "http://192.168.1.104:80/ying/yy.php");
  150. /* 设置请求的数据 */
  151. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  152. /* 创建HttpResponse对象 */
  153. HttpResponse response = httpclient.execute(httppost);
  154. /* 获取这次回应的消息实体 */
  155. HttpEntity entity = response.getEntity();
  156. /* 创建一个指向对象实体的数据流 */
  157. is = entity.getContent();
  158. } catch (Exception e) {
  159. System.out.println("Connectiong Error");
  160. }
  161. // convert response to string
  162. try {
  163. BufferedReader reader = new BufferedReader(new InputStreamReader(
  164. is, "iso-8859-1"), 8);
  165. StringBuilder sb = new StringBuilder();
  166. String line = null;
  167. while ((line = reader.readLine()) != null) {
  168. sb.append(line + "/n");
  169. }
  170. is.close();
  171. result = sb.toString();
  172. System.out.println("get = " + result);
  173. } catch (Exception e) {
  174. System.out.println("Error converting to String");
  175. }
  176. // parse json data
  177. try {
  178. /* 从字符串result创建一个JSONArray对象 */
  179. JSONArray jArray = new JSONArray(result);
  180. for (int i = 0; i < jArray.length(); i++) {
  181. JSONObject json_data = jArray.getJSONObject(i);
  182. System.out.println("Success");
  183. System.out.println("result " + json_data.toString());
  184. // ct_id=json_data.getInt("id");
  185. name = json_data.getString("name");
  186. // if (i == 0) {
  187. // ss = json_data.toString();
  188. // } else {
  189. // ss += json_data.toString();
  190. // }
  191. }
  192. } catch (JSONException e) {
  193. System.out.println("Error parsing json");
  194. }
  195. return name;
  196. }
  197. }

下面是php代码

  1. <?php
  2. require_once("conn.php");
  3. session_start();
  4. $q=mysql_query("SELECT name FROM push WHERE id='".$_REQUEST['id']."'");
  5. while($e=mysql_fetch_assoc($q))
  6. $output[]=$e;
  7. print(json_encode($output));
  8. mysql_close();
  9. ?>

最新文章

  1. jsp标签
  2. python 类以及单例模式
  3. IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
  4. 第一节 HTML网页和CSS样式
  5. Java基础之扩展GUI——使用对话框创建文本元素(Sketcher 4 creating text elements)
  6. 配置php5.6的运行环境
  7. HDFS的体系结构和操作
  8. 详谈 php定时器
  9. Ajax概述
  10. linux系统 备份与还原
  11. java面试大全
  12. linux重要的标准目录和文件
  13. cp命令的实现
  14. java 字符串 asc 加密解密
  15. kafka Topic 与 Partition
  16. [SPOJ 10628]Count on a tree
  17. kvm虚拟化2-qemu-kvm
  18. vue 使用
  19. endnote插入文献时出现{,#}这样的乱码
  20. java 数据类型相关的内容

热门文章

  1. QSting, QChar, char等的转换
  2. Bootstrap历练实例:表单控件大小
  3. python:mysql增量备份
  4. vue-ssr 文档备注
  5. perl学习之裸字
  6. leepcode作业解析-5-15日
  7. Makefile学习(二)----生成静态库文件
  8. ServletResponse使用方法
  9. Linux 文件/文件夹重命名
  10. Leetcode 334.递增的三元子序列