Activity与Service是否处于同一进程
一般来说:同一个包内的activity和service,如果service没有设定属性Android:process=":remote"的话,service会和activity跑在同一个进程中,而且service和acitivity就是在同一个线程(ActivityThread)里面的。
当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现
public class MyService extends Service {
private DownloadBinder mBinder = new DownloadBinder();
public MyService() {}
class DownloadBinder extends Binder {
public void startDownload() {
Log.d("MyService", "startDownload executed");
}
public int getProgress() {
Log.d("MyService", "getProgress executed");
return 0;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bindService = (Button) findViewById(R.id.bind_service);
Button unbindService = (Button) findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
}
Task
task是一组相互关联的activity的集合,存在于一个称为back stack的数据结构中,framework是以栈的形式管理用户开启的activity。task是可以跨应用的,
四种启动模式
standard
标准启动模式,也是activity的默认启动模式。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,当前的桟中的状态为A-->A。
singleTop
如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。
如果以singleTop模式启动的activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。
singleTask
如果一个activity的启动模式为singleTask,那么这个activity如果已经创建,则会remove 掉它上面的Activity,如果没有创建,这里要看taskAffinity(一个任务的taskAffinity决定于这个任务的根activity),如果 taskAffinity 相同则在栈顶启动,如果不同,则会在 taskAffinity对应的栈栈顶创建,如果栈不存在,则创建栈。
如果不同app中的Activity 具有相同的taskAffinity,那么这两个 Activity 会被分配到同一个task 中去
singleInstance
总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。同一时刻在系统中只会存在一个这样的Activity实例。
- 以singleInstance模式启动的Activity在整个系统中是唯一的
- singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中
- 被singleInstance模式的Activity A在开启另一activity B时,能够开启一个新任务,但是是不是真的开启新任务,需要根据当前系统中是不是已经有了一个activity B的taskAffinity属性指定的任务。