irontec 推出了一个开源项目 PHP for Android (PFA),把php带到Android平台上。现在我们来介绍一下。
在安卓项目开发中,我们在启动app的时候,屏幕会出现一段时间的白屏或者黑屏,不同设备时间长短不同。很影响用户体验,所以我们很有必要对其进行优化。
当我们启动一个APP时,如果该app所属的Application还没有在后台运行的话,系统会首先创建一个新的进程去运行这个APP,但进程的创建与初始化都是需要时间的,在这个动作完成之前,如果初始化的时间过长,屏幕上可能没有任何动静,用户会以为没有点到APP而再次去点击应用图标,这极大的降低了用户体验,因此Android需要及时做出反馈去响应用户的点击启动动作,这就有了StartingWindow(也称之为PreviewWindow的预览窗口)的出现,这样看起来就像App已经启动起来了,只是数据内容还没有初始化好。
StartingWindow一般出现在应用程序进程创建并初始化成功前,目的是告诉用户,系统已经接受到操作,正在响应,在程序初始化完成后绘制好启动页UI,会同时移除这个窗口,所以他只是一个临时的窗口。
一般情况下我们会对Application和Activity设置Theme,系统会根据设置的Theme初始化StartingWindow。Window布局的顶层是DecorView,StartingWindow显示一个空DecorView,但是会给这个DecorView应用这个Activity指定的Theme中设置的背景色,如果这个Activity没有指定Theme就用Application的Theme(Application系统要求必须设置Theme),我们在Style中的设置就决定了显示的是白屏还是黑屏,如下:
<application // .... android:theme="@style/AppTheme">
如果我们的AppTheme像如下定义的一样使用了Light主题,那么显示就是白屏,反之如果使用Black主题,那么显示就是黑屏:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
1、首先在res/drawable下新建一个layer-list,名字随便取,比如splash.xml:
layer-list的编写参考:https://www.jb51.net/article/130850.htm
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 背景颜色 --> <item android:drawable="@color/white" /> <item> <!-- 图片 --> <bitmap android:gravity="center" android:src="@drawable/wel_page" /> </item></layer-list>
layer-list大家都会写吧,上面是背景颜色,下面是一张图,这张图可以是全屏的图,可以是一张小图。如果是全屏的图,那上面的颜色也可以不用设置,如果是小图,就要指定下颜色了,并且可以指定图片所在位置。
2、给主题设置Window背景:可以用我们上面的layer-list作为背景,当然也可以设置个全屏的图片。
<style name="SplashTheme" parent="AppBaseTheme"> <!-- 欢迎页背景引用刚才写好的 --> <item name="android:windowBackground">@drawable/splash</item> <item name="android:windowFullscreen">true</item> <!-- <item name="android:windowIsTranslucent">true</item> --> <!-- 透明背景不要了 --></style>
3、在AndroidManifest.xml中定义SplashActivity的theme为SplashTheme:这里注意application使用的theme是AppTheme,而SplashActivity使用的主题是SplashTheme。这样做的效果是只要SplashActivity使用StartAppTheme主题,其他Activity都是用AppTheme主题哦。
<activity android:name=".SplashActivity" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter></activity>
4、SplashActivity的实现,在onCreate()中直接启动你的MainActivity即可,没有setContentView():
public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_load_sir); new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this,MainActivity.class); startActivity(intent); finish(); } }, 3000); } }
在上面第二步中提到可以不使用layer-list,直接设置背景为图片,但是不推荐使用直接使用.png图片作为背景的方式,因为屏幕尺寸太多,图片显示会变形,如果可以我们也可以使用.9.png的背景图来实现,但是使用图片的方式存在一个缺陷就是splash图片是写在theme中的,图片的内存释放不掉,而使用layer-list比较节省内存。
相关推荐:
Android Animation_html/css_WEB-ITnose
Atas ialah kandungan terperinci 启动页进入时有短暂黑屏或白屏现象的终极解决方案. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!