Android笔记

1.活动的声明周期:
    OnCreate -> OnStart -> OnResume -> OnStop -> OnDestroy
                                          -> OnRestart -> OnStart
                               
2.活动之间传递值:
    Bundle    传递简单的值,比如字符串之类的
        OnSaveInstanceState            活动被销毁之前触发
                                    所有设置了ID属性的控件默认都将会保存信息
                                    home、back不会触发该事件
        OnRestoreInstanceState        OnCreate之后触发
    自定义对象
        OnRetainNonConfigurationInstance
        LastNonConfigurationInstance
    * 屏幕方向切换后,当前活动将重新创建一个新的实例(也就是说旧实例的实例属性都被清掉了,只有静态属性会被保留下来)
   
3.三个设置版本:
    Target Framework            目标版本,也就是采用这个版本去编译
    Minimum Android Version        最低允许运行版本
    Target Android Version        期待的运行版本,一般也就是Target Framework
   
4.在指定版本上运行某些功能:
    if(Android.OS.Build.Version.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
        builder.SetCategory(Notification.CategoryEmail);
       
5.Android libray的版本设置:
    引用库:应用的编译版本应该 >= 引用库的编译版本
    创建库:库的编译版本应该 = 应用的最低版本
   
6.处理横竖屏的两种方式:
    自动,使用不同的layout:
        layout目录下面建立一个layout-land的目录,表明里面放置的是屏幕横立时的layout
        * drawable与此相同
    手动,检测当前方向:
        WindowManager.DefaultDisplay.Rotation
        竖向:SurfaceOrientation.Rotation0 或者 SurfaceOrientation.Rotation180
        横向:90,270
        为控件设置不同的RelativeLayout.LayoutParams

7.阻止横竖屏导致的重新开始,重复的OnCreate:
        活动上添加以下属性:
            ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize
        重载 OnConfigurationChanged 方法:
            OnConfigurationChanged(Android.Content.Res.Configuration newConfig){
                 base.OnConfigurationChanged (newConfig);
                 if(newConfig.Orientation == Android.Content.Res.Orientation.Portrait){}
            }
   
8.描画
    Drawable Resources
        放置在Resources/drawable文件夹下
        ShapeDrawable、StateListDrawable、LayerDrawable、TransitionDrawable、LevelListDrawable、ScaleDrawable/ClipDrawable、InsetDrawable、BitmapDrawable
    Canvas
   
9.动画
    View Animations
        根节点:alpha、rotate、scale、translate、set
        动画类型:AcclerateInterpolator/DecelerateInterpolator-加速/减速 BounceInterpolator-最后弹起 LinearInterpolator-恒定速度
    Property Animations
        ValueAnimator、ObjectAnimator、AnimationSet
        ValueAnimator.OfInt、ValueAnimator.OfFloat、ValueAnimator.OfObject
    Drawable Animations
        多个画面之间进行顺序切换,类似于幻灯片,放置于/Resource/drawable 目录下
       
10.安卓资源
    有以下资源目录:
        animator
        anim
        color
        drawable
        layout
        menu
        raw
        values
        xml
       
11.手机的屏幕尺寸原来指的是对角线。。。
    ppi:每英寸像素数 - Pixel per inch, 设备的点密度
    dpi:每英寸多少点 - dot per inch, 印刷品点密度
        dpi=(√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸
    dip/dp:设备独立像素 - Density-independent pixel
        dp = pixels/(dpi/160)
        *指定物理宽度能显示的像素数量
        *抽象意义上的像素,安卓上假定的默认显示设备是160dpi
        *这个公式计算出的像素,最后在各分辨率的屏幕上宽度都一样
        *密度越高,能显示的像素就越多,占用的物理宽度就越少
        * 即同一图片在低密度屏上显得很大,而在高密度屏上很小
       
12.布局
                                            ldpi    mdpi    hdpi
    Launcher、menu                            36*36    48*48    72*72
    tab、Dialog、ListView、StatusBar        24*24    32*32    48*48
    API Level 13(Android 3.2)以上推荐使用dp来使用不同的布局:
        例如:layout-sw700dp
        典型的手机        320dp
        5寸平板/手机    480dp    三星note
        7寸平板            600dp
        10寸平板        720dp
    13以下使用small/normal/large/xlarge来区分,对应关系:
        small    426*320
        normal    470*320
        large    640*480
        xlarge    960*720
        * 单位为dp
    布局基准:
        只为需要的屏幕进行设计
        使用dp而不是pixel
        避免使用AbsoluteLayout,使用LinearLayout,RelativeLayout与GridLayout
        选择一个默认方向
        使用Layout参数
            wrapcontent, fillparent, 样式使用dp参数
           
13.区域化参数
    values文件夹名区分
    values、values-de、values-es
    * 区域化比较耗时,所以很多程序都不提供
    * 3个基准:layouts越少越好,默认区域要测试完整(程序连默认的资源都找不到时会崩溃),只做需要的区域化   
       
14.Assets 用来读取未经过加工的数据
        string content;
        using (StreamReader sr = new StreamReader (Assets.Open ("read_asset.txt")))
        {
            content = sr.ReadToEnd ();
        }
    Resources下面归属于资源系统管理
   
15.服务-Started Services、Bound Services
    Started Services分为3类:
    自己内部用的并可以并发同时访问的、外部程序可调用的、队列顺序执行的
    前两个运行在主线程中,做耗时操作时仍需自己再开线程
    后者运行在新开的线程中,无需自己手动再开线程
    * 后者继承自IntentService,并且需事先父类带string的构造函数:
    * public MyIntentService:base("MyIntentService"){}
    OnCreate
    OnStartCommand
        返回StartCommandResult枚举值,Sticky使用空Intent重启,RedeliverIntent 使用最后的Intent重启
    OnDestroy
    * OnBind 返回IBinder(Bound Service需要)
    * 类以Service属性修饰
    * 需要在AndroidManifest.xml中声明:<service android:name="demoservice.DemoService"></service>
   
    开启与关闭服务:
    StartService、StopService(Context中)
    StopSelf、StopSelfResult(Service中)
   
    其他应用可启动的服务:
    * 需要用IntentFilter在类上修饰属性,同时需要在AndroidManifest.xml中声明
    开启:StartService (new Intent ("com.xamarin.DemoService"));
    关闭:StopService (new Intent ("com.xamarin.DemoService"));

16.    发送一条顶部通知:
        var nMgr = (NotificationManager)GetSystemService (NotificationService);
       
        var notification = new Notification (Resource.Drawable.Icon, "Message from demo service");
        var pendingIntent = PendingIntent.GetActivity (this, 0, new Intent (this, typeof(DemoActivity)), 0);
        notification.SetLatestEventInfo (this, "Demo Service Notification", "Message from demo service", pendingIntent);
       
        nMgr.Notify (0, notification);
    发送一条顶部不消失的通知:
        StartForeground(Service中的方法)
        StopForeground
    发送一条一闪而逝提醒通知:
        Toast.MakeText (this, "The demo service has started", ToastLength.Long).Show();
    service中需要使用Handler:
        var myHandler = new Handler ();
        myHandler.Post(() => {
            Toast.MakeText (this, "Message from demo service", ToastLength.Long).Show();
        });
    * 还有其他两种跟UI交互的方式:
        Android.App.Application.SynchronizationContext.Post()
        System.Threading.SynchronizationContext.Current.Post()
       
17.多媒体
    音频
    播放    MediaPlayer
    录音    MediaRecorder
    通知
    底层版    AudioTrack(播放)、AudioRecord(录音)
       
18.后台运行       
    StartedService
    BoundService
    HybridService
        本地:
        StartService();
        BroadcastReceiver
        远程:
        Messenger
        AIDL(支持多线程)
       
19.Fragments有3个子类:
    ListFragment
    DialogFragment
    PreferenceFragment
    * 安卓3.0以下,兼容包对前两个做了支持,最后一个没有做支持
   
20.列表的使用
    调用安卓的方法时,需要使用Android.Runtime下面的类型,这样再初始化后再改变,在托管代码中才可见
        var badSource  = new List<int> { 1, 2, 3 };
        var badAdapter = new ArrayAdapter<int>(context, textViewResourceId, badSource);
        badAdapter.Add (4);
        if (badSource.Count != 4) // true

posted @ 2016-03-14 09:50  Thyiad  阅读(295)  评论(0编辑  收藏  举报