安卓_安卓开发 - CSDN
安卓 订阅
安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 [1] 展开全文
安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 [1]
信息
更新时间
2019年9月4日 [2]
源码模式
自由及开放源代码软件
发行日期
2008年9月23日
软件许可
Apache License、 GPL等
创始人
安迪·鲁宾(Andy Rubin)
软件语言
C/C++(底层) Java,Kotlin等(应用层)
开发商
Google、开放手持设备联盟
发行商
Google - 谷歌(美国)
软件版本
Android 10(正式版) [2]
软件平台
Google
内核类型
宏内核(Linux内核)
测试版本
Android 11 Developer Preview 3(开发者预览版)
系统家族
类Unix,Linux
软件名称
Android(安卓)
Android系统简介
Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(33张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender公司专门制作的称之为“Droid ” 的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。2012年7月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。(Android logo 相关图片相册图片来源:)
收起全文
精华内容
参与话题
  • Android开发精典案例60个【源码】

    千次下载 热门讨论 2020-07-28 23:32:54
    60个Android开发精典案例,好东西 - 给大家分享60个Android开发的精典案例,包含任务监听、设备适配,游戏框架搭建,特效实现,多点触控,网络协议,游戏关卡设置等内容。特别是做游戏开发的朋友值得研究。喜欢就拿...
  • 安卓开发——登录界面

    万次阅读 多人点赞 2018-09-19 09:00:50
    安卓系统体系架构思维导图

    项目功能需求:
    1> 点击登录按钮,登录成功与否必须有对应的响应事件。
    2> 点击取消按钮,可以退出程序。
    3> 用户名文本框和密码框可以接收由键盘输入的数据,且分别有提示信息。(密码框显示输入的内容不显示)
    4> 要有背景图片

    效果图

    在这里插入图片描述
    一、安卓结构布局分析,外层布局一共有四层为垂直布局,第二三四层内嵌布局为水平布局。
    二、线性布局概述
    线性布局(LinearLayout)是一种比较常用且简单的布局方式。在这种布局中,所有的子元素都是按照垂直或水平的顺序排列在界面上。如果是垂直排列,每个子元素占一行,如果是水平排列,则每个子元素占一列。线性布局可以支持布局样式嵌套实现复杂的布局样式。

    layout文件夹下面的activity_main.xml为布局文件
    LinearLayout标签的常用属性有:
    (1)layout_width:布局宽度(match_parent(适应屏幕宽度)、wrap_content(包裹宽度))
    (2)layout_height:布局高度(match_parent(适应屏幕高度)、wrap_content(包裹高度))
    (3)orietation:方向(vertical(垂直),horizontal(水平))
    (4)gravity:对齐方式(left, right, center……)
    (5)background:背景(颜色、图片)
    三、导入背景图片

    TextView为文本标签,其常用属性有:
    (1)text(文本)【建议文本内容在values下的string.xml中自行定义,例:android:text="@string/login" ;其中login是string.xml文件中的name属性】

    (2)textSize(字体大小)【字体大小单位一般用sp,例:android:textSize=“25sp”】
    (3)textColor(字体颜色)【例:android:textColor="#ff00ff"】
    EditText为可编辑文本框,其常用属性有:
    (1)hint(提示信息)【例:android:hint="@string/et_username"】
    (2)singleLine(单行显示)【属性:(true、false)例:android:singleLine=“true”】
    (3)inputType(输入类型)【属性:(textPassword、datetime、text)例:android:inputType=“textPassword”】
    Button为按钮标签
    提示:为了方便添加事件,每个标签可以增加 ID 属性,格式为:android:id="@+id/bt_log"
    三、按照布局分析将各个标签进行排版布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/b2"
        android:gravity="center"
        android:orientation="vertical"
        tools:context="com.example.admin.register.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login"
            android:textSize="25sp"
            android:textColor="#ff00ff"
             />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal">
    
            <TextView
                android:id="@+id/tv_username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tv_username"
                android:textSize="20sp"
                android:textColor="#000000"/>
    
            <EditText
                android:id="@+id/et_username"
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:hint="@string/et_username"
                android:singleLine="true"
                />
    
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal">
    
            <TextView
                android:id="@+id/tv_password"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tv_password"
                android:textSize="20sp"
                android:textColor="#000000"/>
    
            <EditText
                android:id="@+id/et_password"
                android:layout_width="160dp"
                android:layout_height="wrap_content"
                android:hint="@string/et_password"
                android:inputType="textPassword"
                />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal">
    
            <Button
                android:id="@+id/bt_log"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/bt_log"/>
    
            <Button
                android:id="@+id/bt_bos"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/bt_bos"/>
    
        </LinearLayout>
    
    </LinearLayout>
    
    

    四、打开values文件下面的string.xml文件,在文件中定义layout文件夹下面的activity_main.xml中所需文本。

    <resources>
        <string name="app_name">Register</string>
        <string name="login">用户登录</string>
        <string name="tv_username">用户:</string>
        <string name="tv_password">密码:</string>
        <string name="bt_log">登录</string>
        <string name="bt_bos">取消</string>
        <string name="et_username">输入用户名</string>
        <string name="et_password">输入密码</string>
    </resources>
    
    

    五、打开JAVA文件夹下MainActivity文件添加事件响应。

    为用户名文本框、密码框、登录按钮、取消按钮定义变量。

    通过资源标识获得控件实例,因为类型不同所以要进行强制转换。

    给登录按钮注册监听器,实现监听器接口,编写事件(注:使用匿名内部类)

    Toast是Android系统提供的一种提醒方式,不会占用任何的屏幕空间,所以可以将一些简短的信息通过toast的方式通知给用户,这些信息过一段时间会自动消失
    第一个参数:MainActivity.this,当前的上下文环境
    第二个参数:要显示的字符串,就是你想在屏幕上显示的内容
    第三个参数:显示的时间长短,就是这个字符串在屏幕上显示的时长。Toast默认的有两个LENGTH_LONG(长)和LENGTH_SHORT(短)。
    show(); 显示

    给取消按钮注册监听器,实现监听器接口,编写事件

    finish(); 终止

    package com.example.admin.register;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
        private EditText et_username;
        private EditText et_password;
        private Button bt_log;
        private Button bt_bos;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //利用布局资源文件设置用户界面
            setContentView(R.layout.activity_main);
    
            //通过资源标识获得控件实例
            et_username = (EditText) findViewById(R.id.et_username);
            et_password = (EditText) findViewById(R.id.et_password);
            bt_log = (Button) findViewById(R.id.bt_log);
            bt_bos = (Button) findViewById(R.id.bt_bos);
    
            //给登录按钮注册监听器,实现监听器接口,编写事件
            bt_log.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //获取用户输入的数据
                    String strUsername = et_username.getText().toString();
                    String strPassword = et_password.getText().toString();
    
                    //判断用户名和密码是否正确(为可以进行测试,将用户名和密码都定义为admin)
                    if(strUsername.equals("admin") && strPassword.equals("admin")){
                        Toast.makeText(MainActivity.this,"用户名和密码正确!",Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(MainActivity.this,"用户名或密码错误!",Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
            //给取消按钮注册监听器,实现监听器接口,编写事件
            bt_bos.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
        }
    }
    
    

    以上就是安卓开发登录界面的的过程

    展开全文
  • 安卓 四大组件

    万次阅读 2018-06-29 11:16:46
    Android开发的四大组件 Android四大组件分别为activity、service、content provider、broadcast receive 一、Activity Activity生命周期的方法是成对出现的 onCreate() &amp; onDestory() onStart() ...

    Android开发的四大组件
    Android四大组件分别为activity、service、content provider、broadcast receive
    一、Activity
    这里写图片描述
    Activity生命周期的方法是成对出现的

    onCreate() & onDestory()
    onStart() & onStop()
    onResume() & onPause()

    每一个活动( Activity)都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。 但是当一个活动的状态发生改变的时候,开发者可以通过调用onXX() 的方法获取到相关的通知信息。 在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。
    一,onCreate:当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate方法有一个参数,该参数可以为空(null),也可以是之前调用onSaveInstanceState方法保存的状态信息。 二,在onStart:方法该触发的所属表示将活动被展现给用户四,在onPause:当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。 五,onStop:当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发onStop方法。所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开 者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,在onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。六,onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。七,onDestroy:当活动销毁的时候,触发该方法。和onStop方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法·。 的onSaveInstanceState:系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等活动栈

    每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。
    当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。
    这里写图片描述
    一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。
    Activity状态
    Activity有以下四种状态:
    活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。
    暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。
    当被暂停,一个活动仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,机器人将会杀死一个暂停的活动来为活动的活动提供充足的资源。当一个活动变为完全隐藏,它将会变成停止。停止:。当一个活动不是可视的,它“停止”了这个活动将仍然在内存中保存它所有的状态和会员信息尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个活动停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个活动退出或关闭了,它将变为待用状态。待用:。在一个活动被杀死后和被装在前,它是待用状态的待用胡亚蓉被移除活动栈,并且需要在显示和可用之前重新启动它的活性的四种加载模式在机器人的多活性开发中,活动之间的跳转可能需要有多种方式,有时是普通的生成一个新实例 有时希望跳转到原来某个活动实例,而不是生成大量的重复的活性。加载模式便是决定以哪种方式启动一个跳转到原来某个活动实例。在机器人里,有4种活性的启动模式,分别为:·standard:标准模式,一调用startActivity()方法就会产生一个新的实例。·singleTop:如果已经有一个实例位于Activity stack的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。·singleTask:会在一个新的任务中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

    ·singleInstance:这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
    这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。
    相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
    标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。1、Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
    2、intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    3、startActivity(intent);
    复制代码
    Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。

    FLAG_ACTIVITY_NEW_TASK
    FLAG_ACTIVITY_CLEAR_TOP
    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    FLAG_ACTIVITY_SINGLE_TOP

    核心的特性有:

    taskAffinity
    launchMode
    clearTaskOnLaunch
    alwaysRetainTaskState
    finishOnTaskLaunch

    四种加载模式的区别 所属task的区别
    一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。
    除非Intent包括参数FLAG_ACTIVITY_NEW_任务。如果提供了FLAG 活动新_ TASK参数,会启动到别的任务里。“singleTask”和” singleInstance”总是把要启动的活动作为一个任务的根元素,他们不会被启动到一个其他任务里。是否允许多个实例“standard”和“singleTop”可以被实例化多次,并且是可以存在于不同的任务中;这种实例化时一个任务可以包括一个activity的多个实例; “ singleTask“和”singleInstance“则限制只生成一个实例,并且是task的根元素。singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不创建新的实例。是否允许其它活动存在于本任务内“singleInstance”独占一个任务,其它活动不能存在那个任务里; 如果它启动了一个新的活动,不管新的活动的启动模式如何,新的活动都将会到别的任务里运行(如同加了FLAG 活动 NEW_TASK参数)。而另 三种模式,则可以和其它活动共存。是否每次都生成新实例

    “standard”对于每一个启动Intent都会生成一个activity的新实例;
    “singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
    “singleInstance”是其所在栈的唯一activity,它会每次都被重用。
    “singleTask” 如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法,如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
    ———————————–
    二、Service
    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
    Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中
    通过来声明。可以通过contect.startservice和contect.bindserverice来启动。
    Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

    启动service,根据onStartCommand的返回值不同,有两个附加的模式:
    1、START_STICKY 用于显示启动和停止service。
    2、START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。
    服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
    1、 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
    如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
    采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
    2、使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用的onDestroy()方法。拥有服务的进程具有较高的优先级1.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被杀死。2.如果当前服务已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着服务一般不会被杀死。3。如果客户端已经连接到service(bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。4.如果service可以使用startForeground(int,Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时被杀。如果有其他的应用组件作为服务,活动等运行在相同的进程中,那么将会增加该进程的重要性。本地服务1.不需和活动交互的本地服务2.本地服务和活动交互\ ———————–

    三、Broadcast Receiver
    是一个全局的监听器,属于Android四大组件之一
    作用是监听 / 接收 应用 App 发出的广播消息,并 做出响应
    应用场景为

    1、Android不同组件间的通信
    2、多线程通信
    3、与Android系统在特定情况下的通信


    四、Content Provider详解

    ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。
    android中对数据操作包含有:
    file, sqlite3, Preferences,ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。
    android中提供ContectResolver与ContentProvider来操作别的应用程序的数据。
    使用方式:
    一个应用实现ContentProvider来提供内容给别的应用来操作,
    一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。
    1.ContentProvider
    Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

    2.ContentResolver
    当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。
    3.Uri
    Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。
    第一部分是”content://”。可以看作是网址中的”http://”。
    第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如”blog.csdn.net”。
    第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

    作者:陈进杨

    原文链接:点击这里

    展开全文
  • 安卓面试基础(如会必过)

    千次阅读 多人点赞 2019-01-09 09:42:57
    Activity 1、 什么是Activity? Activity是四大组件之一,他给用户的感受就是一个用户交互界面。一个Activity就是一个可见的界面。 他的特点是:1、可见 2、可交互 他之所以可交互,是因为他同时实现了Window....

    Activity
    1、 什么是Activity?
    Activity是四大组件之一,他给用户的感受就是一个用户交互界面。一个Activity就是一个可见的界面。
    他的特点是:1、可见 2、可交互
    他之所以可交互,是因为他同时实现了Window.Callback和KeyEvent.Callback, 可以处理与窗体用户交互的事件和按键事件.这两个特点,是他和service最大的区别。
    一个Activity在创建于销毁的过程中,会经历一些生命周期。
    如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.
    在这里插入图片描述
    2、Activity的生命周期

    a、简述一下生命周期
    生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法…
    在这个过程中 会针对不同的生命阶段会调用不同的方法

    Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate onDestroy onStop onStart onResume onPause onRestart
    当从A界面跳转到B界面的时候,A界面会调用onPause onStop B界面会调用onCreate、onStart、onResume等。在回到A界面的时候,A界面会调用onReStart、onStart、onResume
    如果B界面是透明的activity,那么进行跳转的时候,A界面是不会调用onStop的,只会调用onPause 再回到A界面的时候,A界面会调用onResume
    b、A界面跳转到B界面的时候,再回到A界面,A界面必然会执行的是哪几个方法。
    两个Activity之间的跳转必然会执行的是onResume方法,这个具体的应用场景是每次回到该界面的时候,如果界面需要展示最新的数据,那么可以在该方法中实现。
    多媒体播放视频的时候, 来了一个电话. onStop() 视频, 视频声音设置为0 , 记录视频播放的位置 mediaplayer.pause();
    onResume() 根据保存的状态恢复现场. mediaplayer.start();
    c、在屏幕旋转的时候,activity的生命周期是怎样的?
    横竖屏进行切换的时候,默认的情况下,Activity会重新的调用onCreate方法。因为竖屏的activity销毁了,再生成一个横屏的activity 。
    在AndroidManifest.xml可以进行配置,我们可以通过android:configChanges进行配置。android:configChanges=“orientation|keyboardHidden|screenSize” 配置了之后,横竖屏切换的时候,就不会调用onCreate了,而是调用onConfigurationChanged的方法。
    在一些特殊应用中,屏幕的方向是写死的,比如游戏。在AndroidManifest中配置android:screenOrientation=“landscape"就可以了。
    d、讲一讲你对activity的理解
    e、设置activity的样式为窗口的样式,对生命周期有什么影响?
    设置窗口样式,需要在配置文件中增加theme的属性
    android:theme=”@android:style/Theme.Dialog"
    activity设置为窗口样式的时候,当启动这个activity的时候,之前那个activity是不会走onStop方法的,而是只走到了onPause方法。

    3、你后台的Activity被系统 回收如何在被系统回收之前保存当前状态?
    在这里插入图片描述
    除了在栈顶的activity,其他的activity在系统资源匮乏的时候,都有可能会被系统回收。这时候系统会调用onSaveInstanceState方法,我们可以往bundle里面存放数据。在activity onCreate里面我们先判断一下bundle是不是为空,如果不为空,就代表这个activity之前被系统回收掉,应该恢复一下现场。我们就可以从bundle里面取值。

    4、对android主线程的运用和理解
    a、主线程也就是UI线程,四大组件都是运行在主线程中的。
    b、主线程中有一个消息队列,主要处理窗口绘制、按钮响应等消息。
    c、如果在主线程里面做耗时的操作,会导致窗口绘制等消息得不到及时的处理,从而有可能会报出anr的错误。

    在这里插入图片描述

    5、如何避免anr?如何解决anr?
    anr是android not response 安卓无响应,这里指的是主线程无响应。将耗时的操作放在子线程中进行可以有效的避免anr。如果出现了anr,我们可以通过log信息以及traces.txt文件进行分析。
    traces.txt里面记录的是stack信息。

    6、Activity的数据传递
    a、基础的数据类型通过Bundle进行传递
    b、传递对象的话,需要该对象实现Serializable或者Parcelable接口,放到bundle进行传递。
    c、在Application中进行存储。其他界面要用的话,就直接来application取就可以了。一个应用程序application的实例只有一个。
    d、大对象,比如bitmap,我们一般都不传递这个对象,我们传递的一般都是路径就可以了。然后通过URI.fromFile()来传递URI

    1. 如何退出Activity?
      退出activity我们只需要调用finish就可以了。退出activity 会执行 onDestroy()方法。
      如何一次性的退出多个Activity?
      a、抛异常强制退出:
      该方法通过抛异常,使程序Force Close。
      验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
      b、记录打开的Activity:
      每打开一个Activity,就记录下来。放到application里面去存起来。在需要退出时,关闭每一个Activity即可。
      8、Activity的启动模式
      首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an “application.” It’s a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 这意思就是说Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。
      Activity有不同的启动模式, 可以影响到task的分配
      Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。

    standard", “singleTop”, “singleTask”, “singleInstance”。

    standard模式, 是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。

    而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视…)。这个模式,降低了位于栈顶时的一些重复开销

    singleTask,和singleInstance,则都采取的另辟Task的蹊径。
    标志为singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。最典型的例子,还是浏览器应用的主Activity(名为Browser…),它是展示当前tab,当前页面内容的窗口。它的构造成本大,但页面的切换还是较快的,于singleTask相配,还是挺天作之合的。

    singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity, 这个栈,只有一个activity

    activity是运行在任务栈中的,一个activity启动另外一个activity,默认的情况下,新的activity也是运行在同一个任务栈里的。service和广播接收者也是没有任务栈的,所以,他们启动activity的时候,给intent设置flag, Intent的flag添加FLAG_ACTIVITY_NEW_TASK

    Service
    9、什么是Service以及描述下它的生命周期?
    service是一个服务,它是不可见的,同样也是运行在主线程中。它的生命周期的方法有onCreate、onStart、onDestory,它还有一些activity的没有的生命周期方法,onBind和onUnbind
    不同的启动方式,生命周期调用的也不同。
    启动Service的方式有两种,一种是startService和bindService
    a、通过startService
    Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。
    这种方式,activity和service是相互独立的。如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行
    b、通过bindService
    Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Service就会调用onUnbind->onDestroyed方法。
    这种方式,activity就和service相互捆绑在一起了。所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Service就会调用onUnbind->onDestroyed方法。

    Activity为什么要绑定Service?是因为有些情况下,我们需要调用service里面的方法。startService的方式我们是调用不到Service里面的方法的。

    如何让服务长期在后台运行,而activity又可以调用到服务里面的方法?
    先startService 然后bindService进行绑定,这个时候就可以调用服务里面的方法了。调用完了之后,你就unBindService,这时候退出界面的时候,服务是一直在后台跑的。

    默认情况下,服务是运行在主线程中的,在特殊的情况下,我们可以通过AndroidManifest文件中进行配置android:process="" 这种情况下,服务就在另外一个进程的主线程中。
    10. 什么是IntentService?有何优点?
    普通的service ,默认运行在ui main 主线程(ID默认是1)
    Sdk给我们提供的方便的,带有异步处理的service类,
    OnHandleIntent() 处理耗时的操作
    11、什么时候需要使用到Service
    因为service是具有较高优先级。Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。所以我们需要使用到服务Service
    在某些情况下,比如服务以及onStart了,那么此时服务的优先级会稍微的低一些,这时候还是有可能被系统回收,可以通过startForground提高服务的优先级,这个时候,系统就不会回收这个服务了。
    因为服务的优先级较高,所以在一些场景中比较适合使用服务,比如:
    a、拥有长连接QQ
    b、定时轮询、耗时操作
    c、服务里面注册广播接收者。有些广播接收者只能通过代码注册,比如屏幕锁屏、屏幕解锁

    广播接收者
    12、简单描述一下广播接收者
    广播接收者有两类,一种是系统本身就有的,一种是我们自己写的广播接收者。
    广播接收者注册的方式也有两种,一种是动态注册,一种是静态注册。
    只能用代码注册的广播,这种广播产生的频率是比较高的。比如电量变化的广播,屏幕解锁的广播。电量变化的广播。
    广播接收者在注册的时候可以指定优先级,用于提高接收到广播的顺序。
    广播一般是用于跨进程通讯的时候。
    13、如何发广播
    广播分为两种,一种是有序广播,一种是无序广播
    有序广播是按顺序被接收的,是可以被拦截和修改里面的数据的。而无序广播则没有接收顺序,也无法修改广播里面的数据。
    拦截广播可以使用abortBroadcast()将有序广播给abort掉
    数据存储
    14、ContentProvider的使用
    把自己的数据通过uri的形式共享出去,这个uri是事先约定好的。
    android 系统下 不同程序 数据默认是不能共享访问,通过ContentProvider可以将自己应用的数据提供给别的应用。
    我们在写内容提供者的时候,需要写一个类继承ContentProvider,然后实现里面的增删改查方法
    query(Uri, String[], String, String[], String)
    insert(Uri, ContentValues)
    update(Uri, ContentValues, String, String[])
    delete(Uri, String, String[])
    15、Android提供的数据存储方式有哪些(内存:效率快,文件中存储临时文件,开关等)
    a、SharedPreferences、sd卡的文件
    b、数据库sqlite(大量的数据存储)
    c、数据存储到服务器上(http协议访问后台接口传输上去)

    View
    16、View的绘制流程,自定义控件的使用
    View如何绘制到手机上,一般用onDraw(Canvas canvas)在画布上(不过在此之前要 onMeasure和onLayout)
    onMeasure->onLayout->onDraw
    onMeasure:计算宽和高,调用setMeasuredDimension
    onLayout: 计算位置
    onDraw: 画在画布上
    自定义控件需要在onMeasure、onLayout、onDraw中的某些方法进行修改,这样才能保证自定义的控件能够在正确的位置正确的大小被正确的画出来。
    自定义属性的使用?
    在values的目录下需要建立一个文件,叫做attrs.xml 这个文件是定义属性规则的。一个属性的名字、取值类型、取值范围
    在布局文件中需要加入命名空间,最后在自定义控件中获取这些值。
    17、View的事件传递
    事件分发dispatchTouchEvent
    事件拦截onInterceptTouchEvent{如在桌面中滑动时,返回true时父拦截事件,点击事件 时,点击时返回false时,不拦截事件传递给子控件就响应了点击事件}
    事件响应onTouchEvent
    事件传递的方向是由父类到子类,事件响应的方向是从子类到父类。

    18、ListView的优化
    listView是由item充填,每个item都是有getView返回的(如果有千百个item,就会有千百个inflate会很占内存的所以系统就给提供了convertView)
    重用了convertView,减少了inflate的次数
    使用ViewHolder,减少findViewById的次数,很大程度上的减少了内存的消耗。
    在这里插入图片描述
    19、布局的优化(就是提高UI的流程度)
    优化布局层次。不要不断的嵌套LinearLayout ,多使用RelativeLayout 尽可能的减少布局的层次。如:左边是图片,右边是文字的,可以就使用一个TextView来完成。drawableLeft。
    ViewStub(延时加载的view,当使用时才加载)、include(提取一个basePager.xml),listview子元素高度的计算

    其他
    20、线程间的通讯
    Handler是用来进行线程间的通信。
    Looper是用来管理所属线程的消息队列MessageQueue的
    每一个线程都需要有一个looper,每一个looper管理一个MessageQueue
    Handler.sendMessage的意思是将某一个message放到MessageQueue中去,looper是个死循环,不断的读MessageQueue中的新消息。
    要让looper的死循环运行起来,得调用Looper.loop()方法。
    我们通常都会在子线程中,发一个消息到主线程中的messagequeue中去。
    21、内存泄露的查找
    内存泄漏本身不会产生什么危害,真正有危害的是内存泄漏的堆积。Android应用内存泄漏的的原因有以下几个:
    0、register之后没有unregister
    1查询数据库后没有关闭游标cursor file没有close
    2 构造Adapter时,没有使用 convertView 重用
    3 Bitmap对象不在使用时调用recycle()释放内存
    4 对象被生命周期长的对象引用,如activity被静态集合引用导致activity不能释放
    内存泄漏如何解决:
    生成hprof文件可以通过adt的工具也可以通过代码生成。debug的dump方法
    22、如何处理大图片,图片缓存

    1. 有效加载大图片,合理设置BitmapFactory.Options的inSampleSize值,减少图片内存占用;
    2. 仅请求图片的大小,inJustDecodeBounds = true,仅请求图片大小,而不会加载图片到内存;
    3. 缓存图片,内存缓存LruCache
      23、描述一下AIDL的原理
      AIDL的全称是android interface definition language 接口定义语言。它所做的事情就是跨进程范围另外一个服务里面的方法的。跨进程范围另外一个服务里面的方法。
      在手机卫士中挂断电话用到过AIDL。我们要获取手机系统的电话服务,用到了aidl 它其实工作的原理就是绑定到一个远程的服务上。然后这个远程服务会返回回来一个代理对象。
      这个代理对象里面的方法,就是我们定义的aidl
      aidl的写法也非常简单,主要分两种。调用系统服务的话,直接找到那个服务的aidl拷贝到我们的项目中就可以了。另外一种是我们自己写aidl,主要注意的一点是aidl是没有访问修饰符的。因为aidl本身就是公开的,就是为了给别人调用的,不需要私有的private方法。
      其实呢,在实际的开发过程中,比较少会写这个aidl,特别是写app,几乎用不到 做rom的时候,倒会遇到。那也比较少。但是你得懂它相关的知识是吧。
      在面试的时候,这个也是经常被用的。所以大家要熟悉这个问题的回答方法。
      我以前在中兴面试别人的时候,只要他能回答上几个关键点,我就会让他过我这关噢。
      1、跨进程 2、aidl在服务端和客户端都需要有一份 3、通过绑定的方式获取远程服务对象的代理IBinder,就可以调用相关的方法。
      跨进程:可用Aidl,广播,隐式意图,或者自己写一个跨进程的一个进程将数据定时存入sd 卡中,然后另一个进程定时从sd卡里面取出数据。
    展开全文
  • Google I/O 2019开发者大会上,谷歌正式公布了安卓系统的全新版本Android Q,这一版本也被称作Android 10,是安卓的第十个主要版本。 现在的安卓已经在全球超25亿设备上激活运行,在手机上更是拥有了大...

    Google I/O 2019开发者大会上,谷歌正式公布了安卓系统的全新版本Android Q,这一版本也被称作Android 10,是安卓的第十个主要版本。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    现在的安卓已经在全球超25亿设备上激活运行,在手机上更是拥有了大部分的市场份额。

    历经十余年时间,进化到第十个大版本的安卓如今都有怎样的能耐?

    安卓Q的新鲜功能

    诸多新功能中最令人瞩目的,当然是全新的手势操作:如今底部的虚拟按键简化成了极窄的导航条。操作也变成了从屏幕向上划是返回桌面,划得稍短一点则会在手机震动后进入多任务界面,而返回操作变成了从屏幕左右两侧向内划。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    全新手势操作的出现,意味着安卓阵营在全面屏手机时代该如何进行操作有了一个定论,即是在MIUI上首次出现的全面屏手势。虽然并不是完全原创,但操作方便学习简单。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    这也意味着在Android 9上短暂出现的“药丸”home键操作,在服役短短一年之后就告别历史舞台,不过对于国内的安卓用户并没有太大影响,大多数用户都随着手机厂商提前进入了全面屏手势操作。

    另一个肉眼可见的明显变化,是全局夜间模式。在此前曾出现过系统UI能变成深色的夜间模式,而在全局夜间模式中,支持夜间主题功能的应用也能随着系统一同变成深色,现在我们能看到变成深色的电话、短信、日历等应用。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    在OLED屏开始在手机上流行的现在,全局夜间模式明显能帮助我们更省电更护眼地使用手机。至于还没有提供夜间主题支持的应用,系统中还加入了强制变暗的功能,可以将应用直接转换为深色界面。

    更进一步的权限管理此前已经在首个测试版初见端倪,现在可以像iOS那样,将应用获取定位的权限设置为尽在应用运行时可用。如此一来,不仅隐私管理可以更加安全,应用随意调取定位产生的耗电也能被遏制。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    请求权限通知的弹窗也改变了交互逻辑,从原来的小区域横向放置,改为了大按钮纵向放置,一上一下区分允许和拒绝,就不会出现因为太近而被按错的情况。

    在访问无线网络时,可以设置为随机MAC地址。这样广告商就无法跟踪手机的固定MAC,也就无法根据你上网时的喜好来给你推送定制化广告。当然,想要从MAC地址知道你在哪的人,这下也得另寻他路。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    应用通知得到了进一步简化,之前的版本中出现了应用通知分组和非常详细的通知设定项,但这对于普通用户来说未免有些眼花缭乱。现在直接改为了提醒我、静音通知和屏蔽三个大的选项,剩下的细节交给系统帮忙完成,可以说非常省心。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    这样的通知设计也与国产定制系统和iOS中的通知收纳/静音设计类似,既保证了能够接收到应用通知,又不会让通知打扰到日常使用。正式版中会不会出现不重要通知收纳或是同应用通知重叠,还得看未来的版本。

    开发者选项中加入了主题设置项,可以对系统强调色、字体和图标样式进行修改。虽然系统还没有像壁纸那样提供显眼的入口,但可以想象,未来安卓将获得更方便更多样的“无痛化”界面自定义功能。对于想要在手机个性化有更多动作的用户,应该有福了。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    还有一些交互上的优化,比如说分享界面更加易用,不仅唤起速度增快还能直接分享链接;Wi-Fi密码可以直接通过二维码分享;桌面上手滑删掉的快捷方式也能即时撤回;用安装包安装应用也只会弹出小窗口,而不是之前的全屏。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    基于数字健康功能,新系统加入了专注模式。如同字面意义那样,通过对应用通知、使用时长等功能的切断,让你不再分心去使用手机专注于当前的工作。在定制系统上,我们或许能看到国产厂商本地化后的专注模式。

    谷歌还在Android Q藏了个小小的野心:桌面模式。在窗口化运行的基础上更进一步,允许手机连接屏幕显示出独立的桌面,还能多窗口同时允许多个应用。看起来吸收了Windows的设计思路,以及三星DeX和华为桌面模式、锤子TNT等的精髓。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    桌面模式的出现,暗示着谷歌在桌面级登陆的野心。至于这份野心具体会是安卓与Chrome OS融合,或是再度推出安卓平板,还是Pixel 4将支持桌面模式输出,等到今年秋季就能有定论。

    Android Q还有机会得到可离线使用的小型化AI,谷歌已经在大会上现场展示。得益于被压缩到500MB左右的本地数据包,语音助理可以快速、精准地响应语音指令,不用等待与服务器沟通。甚至还支持随时的上下文沟通,不需要反复去说让人害羞的唤醒词。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    虽然谷歌还没有推出相关产品,但Android Q也加入了对折叠屏的支持。无论是展开还是折叠,应用都能持续使用而不中断,仅有界面的大小发生变化。不过我们离折叠屏手机的时代还有相当的距离,未来还是个不定数。

    升级机型预测

    说完了Android Q的种种新功能,接下来让人关心的就是什么时候可以升级到新系统。

    首先是安卓阵营的领头人谷歌,目前谷歌旗下有Pixel系列手机,在拥有完整的最新版安卓系统特性的同时,还能得到谷歌的独家优化。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    不出意外的话,Pixel全系列手机将随着Android Q在今年秋季的正式发布同时得到更新,想要最先体验到正式版肯定是首选Pixel。

    作为安卓阵营的重要OEM厂商,三星为旗下机型推送Android Q的时间可能会稍晚一些。按照往年的时间点,三星下半年旗舰Galaxy Note10会早于Android Q正式发布,所以这款手机不会出厂预装新系统。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    从三星近几年的更新速度来看,Galaxy Note 10与Galaxy S10系列这两个2019年旗舰将会最先得到更新,之后是Galaxy Note9与Galaxy S9系列。待到明年年中,三星在今年主推的A系列等中低端手机,才会正式得到Android Q。

    华为在安卓厂商中,是提供系统更新相对积极的一家。由于下半年旗舰Mate系列发布时间都晚于Android Q正式发布,所以Mate 30系列有望预装基于Android Q的EMUI 10,之后推出的机型亦是如此。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    Mate 20系列、P30系列等麒麟980处理器机型,有望在Mate 30系列发布会后第一时间得到更新。Mate 10系列和P20系列等麒麟970处理器机型则可能等到第二批,至于Mate 9系列等更老的机型以及中低端产品,则需要等待华为具体通知。

    荣耀的更新机型和具体时间可能与华为相近,Magic 2和荣耀V20、荣耀20系列为主的麒麟980处理器机型第一批得到Android Q更新,荣耀V10和荣耀10等麒麟970处理器机型稍晚,中低端机型也得依据具体通知来看。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    小米近年来按照谷歌对厂商的要求,执行着一般提供两个大版本更新的策略。出厂系统基于Android 9的小米9系列和红米Note 7系列,还有即将发布的红米K20系列可能是最早升级Android Q的机型,目前小米9已经可以刷入预览版的原生Android Q。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    小米8、小米MIX2S和小米6X等手机将迎来第二次大版本更新,而其余的中低端手机,小米可能会安排在更晚的批次来进行更新。

    OPPO目前已经有Reno得到了Android Q预览版适配,相信未来也能够得到基于ColorOS 6的正式版更新。今年一并上市的Reno 10倍变焦版以及去年底登场的R17系列,也有望得到新版安卓更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    vivo也有X27可以刷入适配的Android Q预览版,未来或许会有X27 Pro、S1、S1 Pro、iQOO、X23、NEX以及NEX双屏版等机型得到更新,按照传统也会是基于最新版FuntouchOS定制。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    魅族对于更新安卓大版本一事并不算很热情,但未来会上市的新机型有望预装Android Q,今年的新旗舰魅族16s或许也会有更新的可能性。

    一加则是对更新安卓版本有十足热情的品牌,前不久他们还为一加3、一加3T提供了Android 9更新。不过未来会更新Android Q的机型顺序可能会是即将发布的一加7、一加7 Pro,一加6和一加6T以及较老的一加5和一加5T。

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

    努比亚得到Android Q更新的机型可能会是红魔3、红魔Mars、努比亚X和努比亚Z18。

    索尼旗下可能有Xperia 1、Xperia XZ3、Xperia XZ2 Premium、Xperia XZ2、Xperia XZ2 Compact、Xperia 10、Xperia 10 Plus等近两年推出的机型得到Android Q更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    htc往年是更新安卓版本较为积极的厂商,但近年来经营不善,导致去年承诺更新Android 9的机型只有U12+、U12、U11+、U11 Life (Android One)。但在U12+国行版迟迟得不到更新的情况下,htc恐怕难有余裕为旧机型提供Android Q。

    联想虽然还没能回归主流手机厂商,但也会为手机提供安卓更新,使用骁龙855的Z5 Pro GT和Z6 Pro有望得到官方的Android Q更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    moto的国际版系统都以轻定制版安卓为主,今年刚推出的G7系列,以及旗舰Z3和低端的E系列都有机会得到Android Q,基于Android One的moto One系列手机也同样如此。

    诺基亚同样选择了定制化不多的系统,不少机型也加入了Android One,所以近两年推出的机型如诺基亚X71、诺基亚8.1、诺基亚X6等都有机会在较快的时间内升级Android Q。

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    由于安卓并不是像iOS那样由单一厂商推出设备,所以各厂商的安卓手机并不能在同一时刻得到更新。而且由于各厂商的定制需要,系统更新的功能和时间也会有些许出入。

    想要体验到系统更新更快,功能更齐全或者是更适合自己的手机,就得多加考虑一番。

    展开全文
  • 开发自己的第一个安卓app

    万次阅读 多人点赞 2017-03-30 11:16:42
    开发自己的第一个安卓app 在开发安卓app的时候,首先我们需要配置一下电脑的开发环境。到jdk官网下载最新版本的jdk安装包。 Window64位下载地址:...
  • 一个人写的操作系统 - Sparrow OS

    千次阅读 2013-12-21 16:19:23
    原文: 一个人写的操作系统 - Sparrow OS 链接:http://blog.csdn.net/michael2012zhao/article/details/17421383 分类: Sparrow操作系统 2013-12-19 19:25 1734人阅读 评论(16) 收藏 ...一个
  • iOS 之苹果运行机制总结

    万次阅读 2018-04-09 14:15:42
    解释一下iOS内存机制,为什么iOS的RAM一直都是最少的但iOS却又是最最流畅的。大神请直接忽略此帖,仅希望小白们看过后不会再因为担心iPad内存不足而到处纠结1G RAM 2G RAM了那档子事了...这些帖子楼主看得眼睛都疼了...
  • Swing窗口去掉标题栏

    千次阅读 2014-02-21 16:35:24
    public class Main {  public static void main() {  Frame frame = new Frame();  frame.setUndecorated(true); ... // Get the current decorated state ... boolean undecorated = frame....
  • 获取安卓手机设备名称 最近公司有个需求,需要获取安卓手机的设备名称 搜了一大波资料后发现大多数获取设备名称的方法都是通过android.os.Build这个类拿到的,但是这种方法只能拿到手机型号啊,不能拿到设备名称=_...
  • 电脑(Linux/Windows系统)使用SSH远程登录安卓(Android)手机实现无线...电脑LinuxWindows系统使用SSH远程登录安卓Android手机实现无线传输和管理文件图文详解 温馨提示 前言 远程登录可以提供的功能 连接条件...
  • Android 6.0、7.0、8.0、9.0差异、适配

    千次阅读 2018-12-11 15:54:23
    一、6.0适配 谈谈Android 6.0 的动态权限管理 二、7.0适配 Android 7.0脱坑指南 三、8.0适配 Android 8.0适配指北 四、9.0适配 Android P 兼容与适配 五、屏幕适配 推荐一种非常好用的Android屏幕适配 ...
  • Android 设置字体加粗属性

    千次阅读 2016-09-08 10:26:32
    android:textStyle=”bold”
  • Android studio 链接逍遥安卓模拟器

    万次阅读 2018-07-26 11:44:43
    Android studio 链接逍遥安卓模拟器 转发请标明出处 鉴于Android studio 自带的模拟器问题太多,基本上大家都会选择连接手机或者另下其他的模拟器,在这里向大家介绍Android studio 链接逍遥安卓模拟器的方法...
  • Android开发:去掉Activity的头部标题栏及全屏显示

    万次阅读 多人点赞 2013-04-09 15:10:17
    打开AndroidManifest.xml文件,找到application节点 android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >修改为如下代码,即可去
  • Android http proxy server 设置

    万次阅读 2016-01-25 00:04:26
    在安装Android studio SDK时经常遇到下面的情况     点击图中的tool-Options,进入界面并进行设置如图 在Android SDKManager Setting 窗口设置HTTPProxy server和HTTPProxy Port这个2个参数,分别...
  • Android 安卓DataBinding详解(超详细)

    千次阅读 2019-12-22 20:52:36
    Android 安卓DataBinding(时刻更新、维护一下文章) Android 安卓DataBinding(一)·基础 Android 安卓DataBinding(二)·入门 Android 安卓DataBinding(三)·单向绑定 BaseObservable Android 安卓DataBindin...
  • 判断当前Android版本是否大于某版本

    万次阅读 2017-06-22 14:35:44
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getGLESTextureLimitEqualAboveLollipop(); }随手一记
  • 下载地址:百度网盘
  • 安卓啥都不会】idea运行android项目

    千次阅读 2019-06-28 10:36:59
    第一步 第二步 第三步 选择模拟器 也可以自己创建模拟器 启动完成
1 2 3 4 5 ... 20
收藏数 2,430,941
精华内容 972,376
关键字:

安卓