-
Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?
Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的Fragment 和 replace 的 Fragment。
先将上一个fragment压栈,再添加一个新的fragment。
transition.addToBackStack(null)
通过popBackStack可以将压入的栈再次显示出来。
supportFragmentManager.popBackStack()
-
App异常退出时,打印日志,重新启动怎么做?
在Application中注册UncaughtExceptionHandler,当发生崩溃会回调uncaughtException()方法,此时在其中做打印日志,重新启动等操作。
public class MyApplication extends Application {
private static MyApplication application;
@Override
public void onCreate() {
super.onCreate();
application = this;
// 程序崩溃时触发线程 以下用来捕获程序崩溃异常
Thread.setDefaultUncaughtExceptionHandler(handler);
}
private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
restartApp(); //发生崩溃异常时,重启应用
}
};
private void restartApp() {
Intent intent = new Intent(this, MainActivity.class);
PendingIntent restartIntent = PendingIntent.getActivity(
application.getApplicationContext(), 0, intent,Intent.FLAG_ACTIVITY_NEW_TASK);
//退出程序
AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
restartIntent); // 1秒钟后重启应用
//结束进程之前可以把你程序的注销或者退出代码放在这段代码之前
android.os.Process.killProcess(android.os.Process.myPid());
}
}
-
res/drawable、res/raw、/assets下的区别
res文件夹和assets文件夹区别:
1.res下创建文件,能将ID注册在R文件中,即能通过R.res.xx获取属性。assets需要用径路来使用文件。
2.res下,打包时自动只打包用的上的文件,没用上的文件不打包;assets文件夹里,无论是否在项目中用到,会被原封不动的打包到APK。
3.res/raw,res/assets下图片不会被压缩,res/drawable下会被压缩。
动画实现原理:
Android视图是以树形结构添加的,子view都有一个父view。当一个view调用动画,会对其比如大小,位置,透明度等发生改变。子view就会在每一帧动画改变后调用invalidate(),invalidate内部获取了parentView-它的父view调用ondraw()进行重绘,父view就会遍历将所有子view进行重绘,从而将子view的变化过程实时绘制出来。
低版本SDK实现高版本api
当程序使用一些方法或属性时,当判断项目minsdk还不支持该属性时,就会报错。那么就要加上
@TargetApi(Build.VERSION_CODES.X),声明让低版本sdk去调用高版本的api。
Android为每个应用程序分配的内存大小是多少?
Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,一旦应用超出这个内存使用值就会OOM。
不同的手机支持的App最大内存不一样。可以通过ActivityManager去获取。
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int memClass = activityManager.getMemoryClass();
获取最大内存:
Runtime rt=Runtime.getRuntime();
long maxMemory=rt.maxMemory();
Android应用程序的默认最大内存值为16M
static public int staticGetLargeMemoryClass() {
// Really brain dead right now -- just take this from the configured
// vm heap size, and assume it is in megabytes and thus ends with "m".
String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
}
Bundle机制
Bundle用于在Activity,fragment之间传值,Activity,fragment保存状态值的使用。
public final class Bundle extends BaseBundle implements Cloneable, Parcelable
Bundle用final修饰,不能被继承。由于要传值,所以需要序列化。
内部使用ArrayMap的键值对进行存储。
ArrayMap<String, Object> mMap = null;
怎么跨进程启动app?
使用PackageManager,通过包名来启动应用,intent需要添加flag FLAG_ACTIVITY_NEW_TASK。
这里启动一个应用,包名为com.libo.wanandroid,启动activity的类路径为com.libo.module_home.activity.HomeActivity:
/**
* 跨进程启动应用
*/
private void remoteLaunch() {
ComponentName componentName = new ComponentName("com.libo.wanandroid", "com.libo.module_home.activity.HomeActivity");
Intent launchIntent = new Intent();
launchIntent.setComponent(componentName);
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);
}
参考:https://blog.csdn.net/binzeefox/article/details/106755762
如何将一个Activity设置成窗口的样式。
<activity>中配置:android :theme="@android:style/Theme.Dialog"
Android中还了解哪些方便线程切换的类?
例如:Runnable AsyncTask EventBus Rxjava 协程
make Project、clean Project、Rebuild Project的区别
Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。
Clean Project:删除之前编译后的编译文件,并重新编译整个Project,比较花费时间,不生成apk。
Rebuild Project:同Clean Project一样
Build APK:重新编译生成apk
子view比父view大时,怎么让子view能超出父view?
在父布局中,加上android:clipChildren="false"这个属性,不限制子view大小,默认为true。
-
如何绕过9.0Http限制?
Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。需要在AndroidManifest.xml文件中的application标签中设置:
android:usesCleartextTraffic="true"
android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。
-
Kotlin中函数的可见性修饰符是怎样的
-
直接在 Activity 中创建一个 thread 跟在 service 中创建一个 thread 之间的区别?
在 Activity 中被创建:该 Thread 的就是为这个 Activity 服务的,完成这个特定的
Activity 交代的任务,主动通知该 Activity 一些消息和事件,Activity 销毁后,该
Thread 也没有存活的意义了。
在 Service 中被创建:这是保证最长生命周期的 Thread 的唯一方式,只要整个
Service 不退出,Thread 就可以一直在后台执行,一般在 Service 的 onCreate()
中创建,在 onDestroy()中销毁。所以,在 Service 中创建的 Thread,适合长期
执行一些独立于 APP 的后台任务,比较常见的就是:在 Service 中保持与服务器
端的长连接。