- 什么是进程?
进程是一个具体的应用程序,线程是进程中的一个分支,为单独完成程序中的某一项或一组功能而存在。应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程(线程是进程中的实体,一个线程必须有一个父进程).简单点就是资源分配的调用基本单位-车间 - 进程如何创建呢
只需要在Manifest需要的Activity,Service中写上android:process="*#$%^". - 进程的等级
1.Foreground Process: 前端的进程状态: 正处于Activity Resume()状态 正处于与bound服务交互状态 正处于服务在前台运行的状态,(startForeground()被调用,例如:播放音乐) Service生命周期函数正在被执行(onCreate(),onStart(),onDestory()) BroadcastReceiver正在执行onReceive()方法 杀死Foreground Process需要用户响应-因为这个安全优先级最高
2.Visible Process 显示进程:Activity不再前端显示.但是也没有完全隐藏,能够看得见,比如弹出一个对话框。(Input Methed)
3.Service Process 在运行的非Foreground,Visible的进程。
4.Background Process 不可见状态哦Activity进程(onStop()被调用)
5.Empty Procecc 没有运行任何Compuments的进程,保留这个进程主要是为了缓存的需要。android五个进程等级 - 进程和线程的区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4.优缺点线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
(此图来源于百度)
- Messenger实现进程中的通信
service中
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
" 代码 "
break;
case 1:
" 代码 "
break;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}}
MainActivity中
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
messenger = new Messenger(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName
componentName) {
}};
bindService(new Intent(MainActivity.this, Music_service.class), mServiceConnection, Context.BIND_AUTO_CREATE);
if (messenger != null) {
Message message = Message.obtain(null, what);
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}}
- Notification
听完课后老师讲的那个Notification.setLatestEventInfo是过去用的,现在已经不能用啦,这里我自己搜索了一个
Notification.Builder builder = new Notification.Builder(this);//新建Notification.Builder对象
PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
//PendingIntent点击通知后所跳转的页面builder.setContentTitle("有新的通知");
builder.setContentText("点击查看");
builder.setSmallIcon(R.drawable.background);
builder.setContentIntent(intent);//执行intentbuilder.setAutoCancel(true);// 打开后图标消失Notification notification = builder.getNotification();//将builder对象转换为普通的notificationstartForeground(1,notification); //运行notification