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" />即可。
下面是实现的方法,开启新线程,每隔一分钟从服务器获取消息,若产生消息,则在手机状态栏通知该消息。
public class LocalService extends Service {
private static String info = null;
private String TAG = "localservice";// 定义打印信息标识
private NotificationManager mNM;// 定义状态栏通知
private final IBinder mBinder = new LocalBinder();// 实例化LocalBinder // public static native void getSqlInfo(); public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
} public IBinder onBind(Intent intent) {
Log.i(TAG, "this is onBind");
return mBinder;
} // 实现创建方法
public void onCreate() {
Log.i(TAG, "this is onCreate");
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 获取通知栏管理器 } // 实现开始方法
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "received start id" + startId + ":" + intent); // 开启线程
MessageThread messageThread = new MessageThread();
messageThread.start(); return START_STICKY;
} // 实现销毁方法
public void onDestory() {
Log.i(TAG, "this is onDestory");
mNM.cancel("qqq", 0);
} // 实现解除bind方法
public boolean onUnbind(Intent intent) {
Log.i(TAG, "this is onUnbind");
return super.onUnbind(intent);
} private void showNotification(String serverMessage) {
int icon = R.drawable.icon; // 通知图标
CharSequence tickerText = "local sevice has started" + serverMessage; // 状态栏显示的通知文本提示
long when = System.currentTimeMillis(); // 通知产生的时间,会在通知信息里显示
// 用上面的属性初始化Nofification// 实例化状态通知
Notification notification = new Notification(icon, tickerText, when); PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, HelloPush.class), 0);// 定义通知栏单击时间触发的intent notification.defaults |= Notification.DEFAULT_SOUND;// 添加声音
// notification.defaults |= Notification.DEFAULT_VIBRATE;// 添加震动
notification.defaults |= Notification.DEFAULT_LIGHTS;// 添加LED灯提醒
notification.flags = Notification.FLAG_AUTO_CANCEL;// 在通知栏上点击此通知后自动清除此通知 notification.setLatestEventInfo(this, "Local Service", tickerText,
contentIntent);// 设置该状态栏通知消息的单击事件
mNM.notify("qqq", 0, notification);// 通知栏显示该通知 } /**
* 从服务器端获取消息
*
*/
class MessageThread extends Thread {
// 运行状态,下一步骤有大用
public boolean isRunning = true; @SuppressLint("SimpleDateFormat")
public void run() {
System.out.println("running++++++++++++++");
while (isRunning) {
try { // 获取服务器消息
String serverMessage = getServerMessage(); SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = formatter.format(curDate);
System.out.println("++++++++++++" + str);// &&str=="08:00"
if (serverMessage != null && !"".equals(serverMessage)
// &&"15:00".equalsIgnoreCase(str)
) {
showNotification(serverMessage);
}
// 休息1分钟
System.out.println("sleeping now+++++");
Thread.sleep(60000);
System.out.println("sleep ended+++++");
} catch (InterruptedException e) {
System.out.println("thread sleep error++++");
e.printStackTrace();
}
}
}
} /**
* @return 返回服务器要推送的消息,否则如果为空的话,不推送
*/
public String getServerMessage() {
System.out.println("getServerMessage++++++++");
info = null;
// getSqlInfo();
// getSql();
info = connecting();
System.out.println("getServerMessage+++++++" + info);
return info;
} // public static int ReturnInfo(final String title) {
// System.out.println("ReturnInfo+++++++++" + title);
// info = title;
// return 1;
// }
//
// public void getSql() {
// try {
// String url = "jdbc:mysql://192.168.1.104:80/test";
// String user = "root";
// String pwd = "";
//
// // 加载驱动,这一句也可写为:Class.forName("com.mysql.jdbc.Driver");
// Class.forName("com.mysql.jdbc.Driver").newInstance();
// // 建立到MySQL的连接
// Connection conn = DriverManager.getConnection(url, user, pwd);
//
// // 执行SQL语句
// java.sql.Statement stmt = conn.createStatement();// 创建语句对象,用以执行sql语言
// ResultSet rs = stmt.executeQuery("select * from push where id = 1");
//
// // 处理结果集
// while (rs.next()) {
// String name = rs.getString("name");
// info = name;
// System.out.println(name);
// }
// rs.close();// 关闭数据库
// conn.close();
// } catch (Exception ex) {
// System.out.println("Error : " + ex.toString());
// }
// } public String connecting() {
/* 存放http请求得到的结果 */
String result = "";
// String ss = null;
String name = null; /* 将要发送的数据封包 */
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("id", "1")); InputStream is = null;
// http post
try {
/* 创建一个HttpClient的一个对象 */
HttpClient httpclient = new DefaultHttpClient(); /* 创建一个HttpPost的对象 */
HttpPost httppost = new HttpPost(
"http://192.168.1.104:80/ying/yy.php"); /* 设置请求的数据 */
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); /* 创建HttpResponse对象 */
HttpResponse response = httpclient.execute(httppost); /* 获取这次回应的消息实体 */
HttpEntity entity = response.getEntity(); /* 创建一个指向对象实体的数据流 */
is = entity.getContent();
} catch (Exception e) {
System.out.println("Connectiong Error");
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
is.close(); result = sb.toString();
System.out.println("get = " + result);
} catch (Exception e) {
System.out.println("Error converting to String");
} // parse json data
try {
/* 从字符串result创建一个JSONArray对象 */
JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
System.out.println("Success");
System.out.println("result " + json_data.toString());
// ct_id=json_data.getInt("id");
name = json_data.getString("name");
// if (i == 0) {
// ss = json_data.toString();
// } else {
// ss += json_data.toString();
// }
}
} catch (JSONException e) {
System.out.println("Error parsing json");
}
return name;
}
}

下面是php代码

<?php
require_once("conn.php");
session_start(); $q=mysql_query("SELECT name FROM push WHERE id='".$_REQUEST['id']."'");
while($e=mysql_fetch_assoc($q))
$output[]=$e;
print(json_encode($output));
mysql_close();
?>

Android Service服务的更多相关文章

  1. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...

  2. Android Service 服务

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  3. Android Service 服务(一)—— Service .

    http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activit ...

  4. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  5. android service服务的学习

    1.Service简单概述   Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...

  6. Android Service 服务(二)—— BroadcastReceiver

    (转自:http://blog.csdn.net/ithomer/article/details/7365147) 一. BroadcastReceiver简介 BroadcastReceiver,用 ...

  7. Android service 服务的应用之电话监听器以及短信监听器

    首先建立一个项目工程文件,如下图所示:

  8. Android Service服务的生命周期

    与activity类似,服务也存在生命周期回调方法,你可以实现这些方法来监控服务的状态变化,并在适当的时机执行一些操作. 以下代码提纲展示了服务的每个生命周期回调方法: public class Ex ...

  9. Android -- service 服务的创建与使用,生命周期,电话监控器

    1. 为什么使用service 应用程序 : 一组组件(activity  service provider receiver)的集合. 一般情况 一个应用程序 会对应一个进程. 一般情况 关闭掉应用 ...

随机推荐

  1. 查询mysql数据库表的信息(表大小、数据大小、索引大小)

    select * from information_schema.TABLES where information_schema.TABLES.TABLE_SCHEMA='databasename' ...

  2. ubuntu下Rhythmbox播放器乱码问题解决方案

    (注:本文部分内容转自互联网)<a href="http://riden001.com/wp-content/uploads/2014/11/45.jpg"><i ...

  3. ASIHTTPRequest详解

    ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRe ...

  4. Android Studio你不知道的调试技巧

    写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点 ...

  5. 看来ms sql server if 中定义个变量出了if 还是可以用的

    begin declare @abc int; end print @abc 可以打出1出来

  6. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_1

    1.  产品安装过程中提示无法创建Domain([ICMD_10033] Command [defineDomain] failed with error [[INFASETUP_10002]) 1) ...

  7. Effective java笔记7--线程

    一.对可共享数据的同步访问 synchronized关键字可以保证在同一时刻,只有一个线程在执行一条语句,或者一段代码块.正确地使用同步可以保证其他任何方法都不会看到对象处于不一致的状态中,还能保证通 ...

  8. (转载)高速ADC的关键指标:量化误差、offset/gain error、DNL、INL、ENOB、分辨率、RMS、SFDR、THD、SINAD、dBFS、TWO-TONE IMD

    (一)一个基本概念 分贝(dB):按照对数定义的一个幅度单位.对于电压值,dB以20log(VA/VB)给出:对于功率值,以10log(PA/PB)给出.dBc是相对于一个载波信号的dB值:dBm是相 ...

  9. [质疑]编程之美求N!的二进制最低位1的位置的问题

    引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...

  10. 数往知来 ADO.NET <八>

    ADO.NET基础 学习目的:通过程序访问数据库 ,ADO.NET就是一组类库, -->connection   用来连接数据库的类 语法:首先需要一个连接字符串 -->以SQL serv ...