AndroidManifest检测: 瞒天过海:使用代理Activity替换原来的Activity 拿到ActivityManagerNative里面的IActivityManager对象动态代理拦截startActivity...ActivityThread里面的IPackageManager,然后动态代理拦截getActivityInfo()函数的ComponentName替换为代理Activity的ComponentName startActivity
Hook Context.startActivity和Activity.startActivity Context的startActivity其实具体是由ContextImpl去实现的,首先来看下framework...的相关源码ContextImpl: @Override public void startActivity(Intent intent) { warnIfCallingFromSystemProcess...(); startActivity(intent, null); } @Override public void startActivity(Intent intent...getLaunchTaskId() == -1) { throw new AndroidRuntimeException( "Calling startActivity...之前做一些事情,然后在startActivity之后再做一些事情其实可以hook startActivity 里面的execStartActivity这个点,因为一个APP进程只对应一个ActivityThread
06-28 11:24:40.359: E/AndroidRuntime(7397): at android.app.ContextImpl.startActivity(ContextImpl.java...:617) 06-28 11:24:40.359: E/AndroidRuntime(7397): at android.content.ContextWrapper.startActivity...方法,Activity继承自Context,重载了startActivity方法。...如果使用 Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,遇到上面那个异常的,都是因为使用了Context...的startActivity方法。
startActivity的流程图 在Activity启动的时候,所处的Task以及Stack都与进程无关。...即,Task与Stack与进程不是绑定在一起的 启动流程 Activity.startActivity(用户进程) startActivity会调用startActivitiyForResult,只是...ActivityStater.startActivity(System_Server进程) startActivityLocked会直接调用startActivity: 找到调用者进程 根据token找到调用者的...= null, mSupervisor, container, options, sourceRecord); // 调用startActivity...return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true,
在非Activity中使用startActivity:Calling startActivity() from outside of an Activity context requires the...= intent.resolveActivity(pm)) { context.startActivity(intent); }...错误提示信息: Caused by: Android.util.AndroidRuntimeException: Calling startActivity() from outside of an...原因分析 activity继承了context重载了startActivity方法,如果使用acitvity中的startActivity,不会有任何限制。...而如果直接使用context的startActivity则会报上面的错误,根据错误提示信息,可以得知,如果要使用这种方式需要打开新的TASK。
Intent(view.getContext(), BlogDetail.class); intent.putExtra(“blog_id”, blog.getId()); view.getContext().startActivity...(intent); 运行时却曝出如下错误: Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside...原因:Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。...如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,遇到上面那个异常的,都是因为使用了Context...的startActivity方法。
一、startActivity的过程 1.1 发起startActivity请求 当应用程序调用startActivity方法时,会将请求传递给ActivityManagerService(AMS)。...然后,ContextImpl.startActivity()方法会将请求传递给Instrumentation.startActivity()。...最后,Instrumentation.startActivity()方法会调用ActivityManagerNative.getDefault().startActivity(),将请求发送给AMS。...1.2 处理startActivity请求 AMS接收到startActivity请求后,会进行一系列的检查和准备工作,包括检查调用者的权限,解析Intent,查找目标Activity的ComponentName...二、startActivity的流程图 下图是来自Gityuan在《startActivity启动过程分析》(https://gityuan.com/2016/03/12/start-activity/
前几天写了篇文章,描述了 Android Q 中,后台禁止启动 Activity 对现有国内 App 中启动页设计的影响。
当时由于主题所限,没有聊到技术细节。今天就延续这个话题,再聊聊 Android Q 限制后台启动 Activity 的具体细节。
今天来聊聊“Android Q 中后台禁止启动 Activity 对现有国内 App 中启动页设计的影响”这个话题,再聊聊 Android Q 限制后台启动 A...
R.color.colorPrimary) .go(new CircularAnim.OnAnimationEndListener() { @Override public void onAnimationEnd() { startActivity...} final long finalDuration = mDurationMills; // 由于thisActivity.startActivity
很多人使用startActivity时候,会碰到如下的异常: Caused by: android.util.AndroidRuntimeException: Calling startActivity...都知道,Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。...如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,遇到上面那个异常的,都是因为使用了Context...的startActivity方法。
我们先来一步步分析 startActivity 的源码,随手写一个 startActivity 的示例,按住 command 键( windows 下按住 control )用鼠标点击 startActivity...startActivity(Intent intent) 源码如下: 1 public void startActivity(Intent intent) { 2 this.startActivity...startActivity已经被hook了!")...startActivity已经被hook了! ...startActivity已经被hook了! 看到这样的 Log,说明我们已经成功的 Hook 了 Context.startActivity()。
intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity...浏览网页 Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity...Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity...startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW,URI); startActivity...); 5.拨打电话 Uri uri = Uri.parse("tel:xxxxxx"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity
1.系统设置界面 startActivity(new Intent(Settings.ACTION_SETTINGS)); 2.当前应用的设置界面 Intent intent = new Intent(...(intent); 3.移动网络设置界面 startActivity(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); 4.WIFI设置界面 startActivity...)); 6.日期时间设置界面 startActivity(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); 7.语言选择设置界面 startActivity...(new Intent(Settings.ACTION_LOCALE_SETTINGS)); 8.声音设置界面 startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS...)); 9.安全设置界面 startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS));
new File("/mnt/sdcard/images/001041580.jpg")); intent.setDataAndType (uri, "image/*"); this.startActivity...("file:///android_asset/helphelp.pdf")); intent.setDataAndType (uri, "application/pdf"); this.startActivity...= Uri.fromFile(new File("/mnt/sdcard/ren.mp3")); intent.setDataAndType (uri, "audio/*"); this.startActivity...= Uri.fromFile(new File("/mnt/sdcard/ice.avi")); intent.setDataAndType (uri, "video/*"); this.startActivity...Q=pname:pkg_name"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); this.startActivity(intent
fun onClick(widget: View) { val intent = Intent(AActivity.this, BActivity::class.java) startActivity...) { val intent = Intent(AActivity@this, BActivity::class.java)//AActivity@this这种写法是错误的 startActivity...(intent) } 网上还有一些kotlin优雅的写法: //正常跳转 startActivity() //携带参数 startActivity("key" to "value") //A页面跳到B页面,再跳到C页面,再跳到A页面时,要求清空B,C页面退出,并且不重走A的生命周期(后退回首页) startActivity(intentFor...(intentFor().clearTask().newTask()) //A页面->B页面->C页面->D页面时,销毁A.B.C这三个页面,整个栈中就D页面 startActivity
Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity...这种写法是跳转到对应的拨号界面 Uri uri = Uri.parse("tel:xxxxxx"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity...2)这种写法是直接拨打电话 Uri uri = Uri.parse("tel.xxxxxx"); Intent it =new Intent(Intent.ACTION_CALL,uri); startActivity..."me@abc.com"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity...; intent.putExtra(Intent.EXTRA_TEXT, msg); startActivity(Intent.createChooser(intent, "分享")); 8.跳转到应用市场
startActivity(Intent intent) { mBase.startActivity(intent); } 熟悉Android委托机制的应该知道,这个mBase...实际指向的是ContextImpl这个类,我们再来看这个类中的startActivity方法 @Override public void startActivity(Intent intent,...这也是为什么在Service中调用startActivity和在BroadcastReceiver(静态注册)中通过onReceive传递过来的context.startActivity时(该context...原因是因为Activity重写了ContextWrapper中的startActivity方法 @Override public void startActivity(Intent intent...) { this.startActivity(intent, null); } @Override public void startActivity(Intent intent
Intent it = new Intent(Intent.ACTION_VIEW, uri); 3. startActivity(it); 4....Intent it = new Intent(Intent.ACTION_CALL, uri); 4. startActivity(it); 5....Intent it = new Intent(Intent.ACTION_SENDTO, uri); 3. startActivity(it); 1....startActivity(it); 5. ...startActivity(it);
领取专属 10元无门槛券
手把手带您无忧上云