Android_UI:Activity

声明周期

这里写图片描述

如何安全的退出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());
    }
}

参考

android 安全退出应用程序的几种方法

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即可,值是父Activityandroid: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系统上就闪退了。
只能做到,电话来了,屏幕点亮,解开屏锁,然后接听。

  1. 其实在锁屏状态下点亮屏幕,显示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); 
  1. 另一种电亮屏幕,解锁,然后才显示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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值