***************************
服务
***************************
服务是运行在后台的。
1.前台进程,
2.可见进程
3.服务进程(当系统内存资源过少得时候,会将其杀掉??
?有机制可以保证服务不被杀死)
4.后台进程
5.空进程
进程之间是如何通讯的IPC
消息队列
主线程执行消息队列,依次执行消息队列中的消息
若服务是运行在主线程中,则若运行时间超过5秒,则会ANR
。
除了主线程以外是不能更改界面的。
只要不是一个线程,就不能改变界面。
Toast不素界面元素,是一个消息。
handler
异步任务
音乐播放器
前台服务,前台服务才不会被系统销毁。用通知放在了前台
进程。
timer隔一段时间去服务上取数据
闹钟管理器
手机休眠的时候服务要不要停止(要考虑的...)
worklock 屏幕黑掉,但线程在运行
新建一个工程
新建一个类继承service类
startComment具体处理服务所执行的动作。
android:name=".类名">
private Button startButton;
startButton = find...();
startButton.setOnclickeListener(this);
onclick(){
if(v.getId()==R.id.startButton){
Intent in = ;
startService(in);
}else{
stopService(in)
}
}
startComm(){
Thread.currentThread.getName();
}
同时在主线程中输出:Thread.currentThread.getName();
都输出main
anr:not responsed
startComment
new Thread(){
public void run(){
for(){
Tread.sleep(6000);
}
}
}
与直接在start中sleep(6000);
的区别
后者会出现anr,前者不会。
但此时服务和新建的线程是两个异步的线程,即,若服务停
止掉,线程不会被停止。
此时可使用标量,使新建的线程停止。
stopSelf();结束本身。
android 对每个进程分配的cup是一样的 一般来说16M
当前应用程序的进程
android.os.Process.myPid();
完全停止整个应用程序
android.os.Process.killProcess
(android.os.Process.myPid());
新建一个服务继承service
在服务和activity之间进行通信
IBinder onBind(){
return new LocalBind();
}
//在本地,同一个线程中可进行通信
//aidl,在不同进程中可进行通信
public class LocalBind extends Binder{
public SecondServide getService(){
return
SecondSercive.this;
}
}
SecondService ss ;
ServiceConnection conn = new ServiceConnection();//
定义为全局变量,生命周期问题
LocalBind bind = service;
ss = bind.getService();
bindButton.seton...(){
isBind = bindService
(intent,,BIND_AUTO_CREATE);/桥,连接/ //此方
法在一个新线程中执行
}
unbind...(){
unbindService(conn);
isBind = false;
}
sayhelloButton.Enable(false);
一个进程 里面可以有很多线程
同一个进程中的组件可以通过bind沟通
但不适合于进程和进程之间的通信,若为进程之间的通信需
要用aidl
无法获得服务的引用
对于服务的bind方法
在Activity中获得服务连接,定义为全局的。
public void onClick(View v) {
Intent intent = new
Intent(this,FirstService.class);
Intent intent2 = new
Intent(this,SecondService.class);
if(v.getId()==R.id.startButton){
startService(intent);
}else
if(v.getId()==R.id.stopButton){
// stopService(intent);
//停止服务
//销毁掉整个程序,包括缓存
android.os.Process.killProcess(android.os.Process.myPid());
//两种不同的销毁存在优先级,后者优先级比较高,在后者存在的情况下不会执行前者,直接销毁进程相关所有资源 }else
if(v.getId()==R.id.bindButton){
isBind =
bindService(intent2, conn, BIND_AUTO_CREATE);
if(isBind){
sayHelloButton.setEnabled(true);
}
}else
if(v.getId()==R.id.unbindButton){
unbindService(conn);
isBind =
false;
sayHelloButton.setEnabled(false);
}else
if(v.getId()==R.id.sayButton){
if(isBind){
System.out.println(ss.sayHello("张三"));
}
}
start交互以后,调用者和服务之间没有之间的关系
startcomment
生命周期,内存不够时,服务所在的进程是可以被关掉的。
避免这种情况
START_STICKY:粘性的,如果返回值为此种,服务所在的进
程被杀掉以后,系统会选择一个内存资源足够的时候将服务
的进程重启。重启服务会重新调用onCreate以及
onStartComment方法,但不会再次传入intent参数。若
intent此时带有参数传递,会报出intent空指针异常。
START_NOT_STICKY:不重启。
START_REDELIVER_INTENT,重启,并重新传递intent,以及其
他参数,若上次有7个startId,重启的时候也重启7个
startId;
三个参数(intent,int flags ,int startId)
startId:
return this.START_STICKY
配置文件中的.类名, .表示当前路径
第二种调用服务
隐式调用
Intent in = new Intent("包名");
配置文件中
模拟服务被干掉的场景
给一个button,button中销毁当前服务,服务会自动重启
启动的时候可以给服务带参数putExtra();
在服务端之间getExtra();
PendingIntent
intent 是请求对象,包含了某一种请求操作,要么是启动
一个activity,要么是启动一个Service;
PendingIntent 是对intent的一种包装。
PendingIntent 可以延迟执行请求操作。其执行可以在另外
的对象(其他的应用程序或组件)里面执行。比如说启动一
个activity,
A要求B做一件事情,B做完之后要触发A的一个操作。回调。
PendingIntent 即 封装回调的操作。
A中
in = new intent(A,B);
PendingIntent pin = PendingIntent.getActivity
(A,0,in,0);
Intent param = new Intent("服务");
Bundle bu = new Bundle();
("operate",pin);
startService(param);
取出服务
intent!=null{
para = intent.getExtras();
PendingIntent pin = param.getParcelable
("operate");
Thread.sleep();
pin.send();
}
通知
notify
图标
点击图标进入界面
点击界面进入一个activity
点击通知,能触发一个动作
动作是延迟的,
创建一个intent
创建一个pendingIntent
创建一条通知,
将通知加到通知栏里面去
main
NotificationManager nm;通知管理器;管理整个android中
的通知
nm = getSystemService(Context.NOTIFICTION_SERVICE);
按钮点击事件
Intent in (A,B);
PendingIntent pin = PendingIntent.getActivity(A,0,
in,0);
Notification note = new Notification
(R.draw.icon,"info",system.currentTimeMillis());
note.setLatesEventInfo(A,"标题一条短信","短信内容是
",pin);//设置通知的内容;
nm.notify(1,note);//将通知交给通知管理器。
我的代码