anroid 外链启动

Android 外链启动app

  • 方式
    在 manifest配置需要启动的acivity
    <intent-filter>
         <!--接收外部跳转-->
         <action android:name="android.intent.action.VIEW" />
         <!--表示该页面可以被隐式调用,必须加上该项-->
         <category android:name="android.intent.category.DEFAULT" />
         <!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
         <category android:name="android.intent.category.BROWSABLE" />
         <data android:scheme="scheme"/>
     </intent-filter>
    
    浏览器页面代码加载协议为android:scheme属性值的链接向系统发起调用服务请求,系统的广播系统就会匹配当前系统中的intent-filter,如果其子标签的action、category和data都匹配的话,则会调起此activity,如果app没有加载,则先加载app的apk到进程,再启动对应的activity。
  • 注意事项
    现象:
    很多app的首页activity都是在显示完SplashActivity后再启动的,首页activity的launchMode都是设置为singleTask,确保实例的唯一性,当我们的app已经启动了的情况下,再次通过外链的方式启动首页activity是无法启动的。
    原因:
    从android的task堆栈角度来说,浏览器activity所在task是在浏览器的process当中的,而起启动SplashActivity后此activity是在浏览器所在的task,此时在SplashActivity中启动app的首页activity,而首页activity是在另外的process的task当中,故无法切换这个task到前台。
    解决方法:
    在启动首页activity的intent对象中添加FLAG_ACTIVITY_NEW_TASK,在浏览器器task中通过FLAG_ACTIVITY_NEW_TASK启动首页activity,此时系统会寻找和首页activity具有相同的taskAffinity的task,即找到app的process中首页所在的task,将此task推到前台,到此实现了通过外链的方式再次现身app首页activity的功能。

Activity 的onNewIntent函数

  • onCreate是用来创建一个Activity也就是创建一个窗体,但一个Activty处于任务栈的顶端,若再次调用startActivity去创 建它,则不会再次创建。若你想利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理。在onNewIntent 里面就会获得新的Intent.
  • 如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于
    onPause
    onStop 状态的话
    其他应用再发送Intent的话,执行顺序为:
    onNewIntent
    onRestart
    onStart
    onResume
  • launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实 例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法.
  • 系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法.
public void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
 
  setContentView(R.layout.main);
 
  processExtraData();
 
}
 
 
 
protected void onNewIntent(Intent intent) {
 
  super.onNewIntent(intent);
//must store the new intent unless getIntent() will return the old one
  setIntent(intent);
 
  processExtraData()
 
}
 
private void processExtraData(){
 
  Intent intent = getIntent();
 
  //use the data received here
 
}
posted @ 2023-02-07 10:43  年年糕  阅读(47)  评论(0编辑  收藏  举报