美文网首页
Activity 启动 模式

Activity 启动 模式

作者: 莫库施勒 | 来源:发表于2019-06-11 17:50 被阅读0次

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属性指定的任务。

相关文章

网友评论

      本文标题:Activity 启动 模式

      本文链接:https://www.haomeiwen.com/subject/ppccfctx.html