
除了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是否还能实现程序自启动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)