如何在另外一个类里面获得某个activity的实例

如何在另外一个类里面获得某个activity的实例,第1张

 在“手机页面之间的跳转”一文中我介绍了如何运用setContentView()方法切换布局文件Layout的方式进行手机页面间的跳转, 这种适合更改背景,文字颜色,文字内容,但是始终是一个Activity,如果要把主控权移交给另外一个Activity,切换布局文件Layout的方式就办不到了。

如何把主控权移交给另外一个Activity呢?原理:通过Intent对象和startActivity()方法配合来实现。在主程序里使用startActivity()方法调用另外一个Activity,但是最主要的不是这个startActivity()方法,而是Intent对象,Intent在英文中是“意图”的意思,在主Activity当中,告诉程序自己是什么,并想要前往哪里,这就是Intent对象要做的事情了。在主Activity(ActivityOne)里放置一个按钮,当单击这个按钮的时候,告诉主Activity(ActivityOne)前往ActivityTwo,并在ActivityTwo里放置一个回到主Activity(ActivityOne)的一个按钮。

实现步骤

一:布局文件编写

11:第一个布局文件mainxml

<xml version="10" encoding="utf-8">

<LinearLayout xmlns:android=">

PushService的工作很简单,启动后发一个广播在通知栏显示通知,然后常驻在后台

这个广播类用来在通知栏d出通知

点击通知栏后,会发送一个广播,NotificationReceiver收到该广播后,就会判断,app进程是否仍然存活,根据app进程的不同状态,定义不同的app启动方式

SplashActivityjava先是app启动的,3s后进入MainActivity, 如果启动SplashActivity的Intent中带有参数,就将参数取出,放入启动MainActivity的Intent中

MainActivity中,如果有参数传入,就在初始化结束后,根据参数启动DetailActivity,如果没有参数传入,就此结束自己的任务

DetailActivityjava

比较简单,显示传入的参数即可:-D

本文介绍在Android中启动未在AndroidManifest中注册的Activity的一个解决方案。主要需要掌握以下知识点:

Activity默认都需要在AndroidManifest中注册,未注册的应用无法启动。AMS在启动应用时,会检测是否已经注册。因此,如果想要启动未注册的Activity,那么需要在Activity前,替换启动应用的Intent为已经注册过的Activity,因此可以新建一个Activity,用于占位。在检测通过后,真正启动Activity前再替换回需要启动的未注册的Activity。

调用startActivity方法后,最后都会在Instrumentation的execStartActivity方法中调用AMS的远程方法进行处理。Android60及以下和Android60以上,在execStartActivity中调用AMS的方法有所不同,因此需要做兼容处理。

通过调用ActivityManagerNativegetDefault()来获取AMS。

通过调用ActivityManagergetService()来获取AMS。

启动Activity的消息,会回调到ActivityThread中的mH的dispatchMessage方法,可以通过给mH设置一个callBack,在callBack的handleMessage中,然后替换回真正要启动的Intent,然后返回false,让handleMessage再继续处理。

Android80及以下,在ActivityThread的mH中的handleMessage方法中,会处理LAUNCH_ACTIVITY类型的消息,在这里调用了handleLaunchActivity方法来启动Activity。

和80一样,设置callBack,然后修改Intent。

在ActivityThread的mH中的handleMessage方法中,会处理EXECUTE_TRANSACTION类型的消息,在这里调用了TransactionExecutorexecute方法

execute方法中会调用executeCallbacks

这个方法里会调用ClientTransactionItem的execute方法。ClientTransactionItem是在ActivityStackSupervisor中的realStartActivityLocked中添加的

因此,ClientTransactionItem对应的具体类为LaunchActivityItem,它对应的execute方法

在它的方法里又调用了ClientTransactionHandler的handleLaunchActivity,而ClientTransactionHandler就是在ActivityThread中定义的

ActivityThread继承了ClientTransactionHandler,那么它就会实现handleLaunchActivity。最终在这个方法里启动Activity

到这里,就可以启用同一应用内未注册的Activity。

启动非同一应用内的Activity,相比启动同一应用内的Activity,需要多几个步骤。由于不在一个应用内,所以需要把插件的APK先加载进来,然后同样也需要在AMS检测前替换Intent为占位的Intent,在检测后,启动Activity前替换回为需要启动Activity的Intent。另外,由于插件是动态加载进去的,也需要解决资源加载的问题。

加载插件主要是用到类加载器

这个过程和应用内的情况是一样的,不再赘述

加载资源主要用到AssetManager的addAssetPath方法,通过反射来加载

>

使用am start命令启动android apk应用程序

启动tbox service test apk

adb root

adb shell

am start -n comdemohmixxxservicesxxx/MainActivity

程序的入口类可以从每个应用的AndroidManifestxml的文件中得到;

启动的方法可以从每个应用的AndroidManifestxml的文件中得到;

还可以使用 pm 和 dumpsys命令得知

这种情况下,只知道一个apk名字,也没有打开使用过,则使用

其中有如下一行,可知要启动的package和activity

a738865 comdemohmionstarservicestbox/MainActivity

公众号

面试官:说说 startActivity 吧

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9676632.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存