声明周期
如何安全的退出App
退出app的时候,要把所有的Activity否finish掉。
关闭App的方法
1. 获取当前进程的id,然后杀死进程
android.os.Process.killProcess(android.os.Process.myPid())
通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空
2. 终止当前正在运行的Java虚拟机,导致程序终止
System.exit(0);
不会把自己的应用程序杀死
3. 强制关闭与该包有关联的一切执行
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
只能杀死别人,不能杀死自己
4. 企业中的做法:在Application的onCreate()中创建List,把activity放在List中,关闭app时,遍历集合,调用finish()方法。
public class MyApplication extends Application {
private static List<Activity> activityList = new ArrayList<>();
@Override
public void onCreate() {
super.onCreate();
}
public static void addActivity(Activity activity) {
if (activity != null) {
activityList.add(activity);
}
}
public static void removeActivity(Activity activity) {
if (activity != null) {
activityList.remove(activity);
activity.finish();
}
}
public static void exitApp() {
for (Activity activity : activityList) {
if (activity != null) {
activity.finish();
}
}
System.exit(0);
}
public static void exitApp2() {
for (Activity activity : activityList) {
if (activity != null) {
activity.finish();
}
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
参考
onBackPressed()与finish()的区别
如果使用onBackgress(),假如你的Activity有添加管理frgament回退的话,调用该方法是不会退出Activity的.直到Fragment回退栈清空,才会退出Activity.
如果使用finish(),那么就会直接退出Activity
参考:最常用的Activity的onBackPressed()与finish()的区别.
按home键的生命周期
onPause()
onStop()
Notification启动Activity时保留导航
就是在MainActivity
中发送Notification
,点击开启NewActivity
,当关闭NewActivity
后,会回到MainActivity
。
根据activity分2种实现方式:
- 常规Activity
- 特殊Activity
那么到底是什么意思呢?我们知道从Notification
打开Activity_A
,必须给Activity_A
设置android:launchMode="singleTask"
或intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
,但是这个Activity_A
只可以在通知种打开,在其他Activity
中无法启动它,我们把Activity_A
成为特殊的Activity
,这个Activity_A
不是工作流的一部分,可以让它既可以从通知中打开Activity_A
,也可以在其他Activity
中打开,这是可以的,这种就是常规Activity
。
常规Activity
第一步:在AndroidManifest.xml中定义NewActivity的层级结构
首先在AndroidManifest.xml中定义NewActivity的层级结构,对于Android4.1只需要设置parentActivityName
即可,值是父Activity
中android:name=".MainActivity"
中name
的值,对于老版本,还需要添加meta-data
。
<activity
android:name=".NewActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
根据可启动 Activity 的 Intent 创建返回栈:
Intent intent = new Intent(context, NewActivity.class);
TaskStackBuilder builder = TaskStackBuilder.create(context)
.addParentStack(NewActivity.class)
.addNextIntent(intent);
PendingIntent pendingIntent = builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
build.setContentIntent(pendingIntent)
特殊Activity
第一步:在清单文件中,将以下属性添加到 Activity 的 元素
<activity
android:name=".NewActivity2"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:taskAffinity=""/>
android:excludeFromRecents="true"
确保点击通知打开NewActivity2
时不会销毁MainActivity
第二步:构建并发出通知
Intent intent = new Intent(context, NewActivity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
build.setContentIntent(pendingIntent)
Android开发之锁屏显示Activity
转发:http://blog.csdn.net/z_x_qiang/article/details/55210807
类似闹铃,微信视频通话,qq视频通话等都需要在锁屏状态下点亮屏幕,或者启动activity之类的。
最近在做视频通话是基于环信服务的,和微信视频通话是一样的,只不过是Activity横竖屏问题。结果就出问题了,竖屏在各个手机上没问题,可是横屏在华为7.0系统上就闪退了。
只能做到,电话来了,屏幕点亮,解开屏锁,然后接听。
- 其实在锁屏状态下点亮屏幕,显示activity很简单,在oncreate()方法中添加下面的代码就可以实现(横屏在部分手机上会闪退,竖屏能正常运行):
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- 另一种电亮屏幕,解锁,然后才显示activity:
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON //这个是点亮屏幕
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //这个是透过锁屏界面,相当与解锁,但实质没有
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //这个是保持屏幕常亮。
第二种在不同的手机上可能不能电亮屏幕,例如在华为mate9的7.0系统就不能电亮屏幕,可以通过另一种方式电亮屏幕:
manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
newWakeLock = manager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
newWakeLock.acquire();//点亮屏幕(常亮)
在activity销毁的时候熄灭屏幕:
newWakeLock.release();//熄灭屏幕
透明的Activity
效果图:可以看到只有ActionBar和TextView(红色方块)是不透明的,其余看到的是手机主界面。
android:theme="@android:style/Theme.Translucent"
或者
把这2行代码放到app style中就是所有页面都是透明的(此时Activity可以继承Activity)
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
如果针对的是某一个Activity
<style name="TranslucentStyle">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
然后在AndroidManifest.xml的theme中使用
<activity android:name=".MainActivity"
android:theme="@style/TranslucentStyle"/>
注意Activity不可以继承AppCompatActivity,只能是Activity
Activity与Fragment的区别和关系
1 Fragment是Android3.0之后才加入的。
2 Fragment是依赖于Activity而存在,可以把Fragment看做是Activity的子控件。3.0前,一个屏幕就只有一个Activity,3.0后一个屏幕可以有多个Fragment。
3 Fragment的生命周期比Activity多了几个:onAttach()+onDetach,onCreateView+onDestroyView()
4 Activity如果使用Fragment,必须继承自FragmentActivity