Android —— Activity的四种启动模式

Android —— Activity的四种启动模式,第1张

除了Activity的生命周期外,Activity的启动模式也是一个难点,有时候为了满足项目的特殊需求,就必须使用Activity的启动模式。

在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,但是有些场景重复创建多个实例,是没有必要且浪费资源的,这就需要启动模式来修改系统的默认行为。

下面,我将以理论+实践的形式为大家介绍Activity的启动模式。

这是系统的默认启动模式,采用这种模式的Activity无论是否已经存在实例,都会重新创建一个实例,在这种模式下谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

实践:MainActivity 采用 standard 模式

在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的 NewIntent 方法将会被回调。如果新Activity的实例已存在但不是位于栈顶,那么新Activity依然会被创建。

实践:MainActivity 采用 singleTop 模式

MainActivity 采用 singleTop 模式,SecondActivity采用 standard 模式

这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,而是回调 onNewIntent() 。

实践:MainActivity 采用 singleTask 模式

MainActivity 采用 singleTask 模式,SecondActivity采用 standard 模式

这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此模式的Activity只能单独的位于一个任务栈中。

实践:MainActivity 采用 singleInstance 模式

MainActivity 采用 singleInstance 模式,SecondActivity采用 standard 模式

以上就是Activity启动模式的介绍。

欢迎留言指出错误。

Android系统通过应用程序自行在系统中登记注册事件(即Intent)来响应系统产生的各类消息。

例如Android实现系统开机自启动程需要在Manifest中加入如下Intent-filter及权限Uses-permission即可。

<intent-filter>

<action android:name="androidintentactionBOOT_COMPLETED"/>

(修改时候主要是去掉上面该行即可)

<category android:name="androidintentcategoryHOME" />

</intent-filter>

<uses-permission android:name="androidpermissionRECEIVE_BOOT_COMPLETED"/>

(修改时候主要是去掉上面该行即可) Android系统为应用程序管理功能提供了大量的API,可以通过API控制Intent和permission,其中

上述配置表示应用程序会响应系统产生的androidintentactionBOOT_COMPLETED(系统启动完成)信号,以此来实现应用程序自启动。当然知道上述原理后,我们就可以随心所欲的控制程序开机自启动了。具体思路如下:

一、手工方法

基于上述原理,我们可以通过对系统中已安装的程序去除其Manifest的上述配置片段来控制应用程序的对系统的响应,当然没源码可修改编译的情况下只能实现屏蔽其对有些信号的响应,例如屏蔽该程序不再开机自启动。手工方法就是利用有关工具直接在解压其APK包后,修改其Manifest的上述配置行后再打包成APK,最后安装到系统中就实现了屏蔽其自启动功能。具体相关的工具软件主要有APKTOOL。(请自己放狗去搜索下载)

二、编程实现

当然手工方法需要借助APKTOOL等工具,步骤比较法繁琐,我们可以通过自己开发来实现该功能。幸好

1、PackageManager

本类API是对所有基于加载信息的数据结构的封装,包括以下功能:

·安装,卸载应用

·查询permission相关信息

·查询Application相关信息(application,activity,receiver,service,provider及相应属性等)

·查询已安装应用

·增加,删除permission

·清除用户数据、缓存,代码段等

非查询相关的API需要特定的权限,具体的API请参考SDK文档。

2、ActivityManager相关

本类API是对运行时管理功能和运行时数据结构的封装,包括以下功能

·激活/去激活activity

·注册/取消注册动态接受intent

·发送/取消发送intent

·activity生命周期管理(暂停,恢复,停止,销毁等)

·activity task管理(前台->后台,后台->前台,最近task查询,运行时task查询)

·激活/去激活service

·激活/去激活provider等

task管理相关API需要特定的权限,具体API可参考SDK文档。

安装自启动: 要做这个功能有一个前提,那就是用户的机器上已经装过相应应用,也就是说只有升级APK的时候才可以这么干,因为要执行的功能需要程序的配合。具体步骤如下: 首先要知道程序已经安装完成,所以需要在程序中注册一个广播监听(必须是静态的,你懂的)apk安装完成的action:"androidintentactionPACKAGE_ADDED",在这个广播的onReceive方法中监听action,并通过intentgetDataString()方法判断安装程序的包名是否属于自己的包名,如果是做下一步 *** 作;通过Intent显式或者隐式的启动你自己的程序。建议:  最好不要这样干,你要考虑一下用户的感受,特别是那种自动安装不需要点确认的时候,正在玩游戏、看视频、看小说、用微信你自动打开一个应用开机自启动 android实现开机自启动可能是移动 *** 作系统中最简单的了,只需要监听一个开机启动的Broadcast(广播)即可。首先写一个Receiver(即广播监听器),继承BroadcastReceiver。如下所示: public class BootReceiver extends BroadcastReceiver { private PendingIntent mAlarmSender; @Override public void onReceive(Context context, Intent intent) { // 在这里干你想干的事(启动一个Service,Activity等),本例是启动一个定时调度程序,每30分钟启动一个Service去更新数据 mAlarmSender = PendingIntentgetService(context, 0, new Intent(context, RefreshDataServiceclass), 0); long firstTime = SystemClockelapsedRealtime(); AlarmManager am = (AlarmManager) context getSystemService(ActivityALARM_SERVICE); amcancel(mAlarmSender); amsetRepeating(AlarmManagerELAPSED_REALTIME_WAKEUP, firstTime, 30 60 1000, mAlarmSender); } } 接下来,只需要在应用程序配置文件AndroidManifestxml中注册这个Receiver来监听系统启动事件即可如下所示: <receiver android:name="serviceBootReceiver"> <intent-filter> <!-- 系统启动完成后会调用--> <action android:name="androidintentactionBOOT_COMPLETED"> </action> </intent-filter> </receiver>

1首先开机启动后系统会发出一个Standard Broadcast Action,名字叫androidintentactionBOOT_COMPLETED,这个Action只会发出一次。2构造一个IntentReceiver类,重构其抽象方法onReceiveIntent(Context context, Intent intent),在其中启动你想要启动的Service。3在AndroidManifestxml中,首先加入<uses-permission android:name=androidpermissionRECEIVE_BOOT_COMPLETED</uses-permission来获得BOOT_COMPLETED的使用许可,然后注册前面重构的IntentReceiver类,在其<intent-filter中加入<actionandroid:name=androidintentactionBOOT_COMPLETED /,以使其能捕捉到这个Action。一个例子xml:<uses-permission android:name=androidpermissionRECEIVE_BOOT_COMPLETED</uses-permission<receiver android:name=OlympicsReceiver android:label=@string/app_name<intent-filter<action android:name=androidintentactionBOOT_COMPLETED /<category android:name=androidintentcategoryLAUNCHER /</intent-filter</receiverjava:public class OlympicsReceiver extends IntentReceiver{/要接收的intent源/static final String ACTION = androidintentactionBOOT_COMPLETED;public void onReceiveIntent(Context context, Intent intent){if (intentgetAction()equals(ACTION)){contextstartService(new Intent(context,OlympicsServiceclass), null);//启动倒计时服务ToastmakeText(context, OlympicsReminder service has started!, ToastLENGTH_LONG)show();}}}注意:现在的IntentReceiver已经变为BroadcastReceiver,OnReceiveIntent为onReceive。所以java这边的代码为:(也可以实现应用程序开机自动启动)public class OlympicsReceiver extends BroadcastReceiver{/要接收的intent源/static final String ACTION = androidintentactionBOOT_COMPLETED;public void onReceive(Context context, Intent intent){if (intentgetAction()equals(ACTION)){contextstartService(new Intent(context,OlympicsServiceclass), null);//启动倒计时服务//这边可以添加开机自动启动的应用程序代码}}}

其实是不用解锁,就能运行的应用,比如闹钟、日历事件等等,如下解释:

从 Android N 开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为 Direct Boot(直接启动)的新模式中。在此模式下, *** 作系统可以全功能运行,但不允许访问私有应用数据,只能运行经过更新、可支持直接启动功能的应用。

直接启动适合我的应用吗?并非所有应用都应运行在直接启动模式下,因此,在开始编码之前,请务必先检查您的应用是否符合以下常见的用例:

安排闹铃的应用,如闹钟。

提供重要且及时的通知的应用,如短信应用。

为其他应用或系统提供服务的应用,例如辅助工具服务。

1、下载安装AnimGIF Live Wallpaper

2、进入AnimGIF Live Wallpaper,点击左下方的设置按钮,选择“Set GIF Image”按钮即进入文件目录浏览,找到需要设置为壁纸的GIF动图,点击设置壁纸即可。

注意事项:

1、GIF动图体积不要过大,尽量不要超过1M,否则会出现卡顿、掉帧等播放问题;

2、设置动图为壁纸后,会导致耗电量的增加。

 启动界面Splash Screen在应用程序是很常用的,往往在启动界面中显示产品Logo、公司Logo或者开发者信息,如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥的时间。

Android 应用程序创建一个启动界面Splash Screen非常简单。比如创建一个工程MySample,主Acitity就叫MySample,创建另一个Activity叫 SplashScreen,用于显示启动界面,资源文件为splashxml。至于如何制作SplashSceen界面,这不是本文章要讨论的东西,就此略过。

SplashScreen的代码如下:

package comctoofandroid;

import androidappActivity;

import androidcontentIntent;

import androidosBundle;

import androidviewMotionEvent;

public class SplashScreen extends Activity {

protected boolean _active = true;

protected int _splashTime = 5000;

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutsplash);

Thread splashTread = new Thread() {

@Override

public void run() {

try {

int waited = 0;

while(_active && (waited < _splashTime)) {

sleep(100);

if(_active) {

waited += 100;

}

}

} catch(InterruptedException e) {

// do nothing

} finally {

finish();

// 启动主应用

startActivity(new Intent("comctoofandroidMySampleMyApp"));

stop();

}

}

};

splashTreadstart();

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (eventgetAction() == MotionEventACTION_DOWN) {

_active = false;

}

return true;

}

}

然后在AndroidMainfestxml中修改代码如下:

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

<manifest xmlns:android=""

package="comctoofandroid"

android:versionCode="1"

android:versionName="10">

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name="SplashScreen"

android:label="@string/app_name">

<intent-filter>

<action android:name="androidintentactionMAIN" />

<category android:name="androidintentcategoryLAUNCHER" />

</intent-filter>

</activity>

<activity android:name="MyApp">

<intent-filter>

<action android:name=" comctoofandroid MySampleMyApp " />

<category android:name="androidintentcategoryDEFAULT" />

</intent-filter>

</activity>

</application>

<uses-sdk android:minSdkVersion="4" />

</manifest>

在这里负责注册两个活动。把负责管理启动界面Splash Screen的活动Activity作为应用程序的主活动,然后在SplashScreen中负责启动MyApp。

另:

很多应用都会有一个启动界面。欢迎画面慢慢隐现,然后慢慢消隐。实现这种效果的方法有两种(暂时只发现两种)

1、使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一张Activity。

2、使用一个Activity,可以用到Viewgone() 这个方法。把Acitivity的某些元素移除。

Java代码

public class Splash extends Activity {

private final int SPLASH_DISPLAY_LENGHT = 3000; //延迟三秒

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutsplash);

new Handler()postDelayed(new Runnable(){

@Override

public void run() {

Intent mainIntent = new Intent(Splashthis,Mainclass);

SplashthisstartActivity(mainIntent);

Splashthisfinish();

}

}, SPLASH_DISPLAY_LENGHT);

}

}

当然可以再Splash中加入动画效果。

android程序强行关闭后,让程序自动启动的方法为:

1、自己建一个service,不断的去判断,如果Activity挂掉了,就在service里启动它。

2、在程序里面写个广播什么的到程序里面 ,比如 一些apk程序。一检测到wifi开启,广播就激发,启动程序。

以上就是关于Android —— Activity的四种启动模式全部的内容,包括:Android —— Activity的四种启动模式、android怎么设置开机启动软件、现在的Android是否还能实现程序自启动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/zz/10133926.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存