`
haitaoandroid
  • 浏览: 27462 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

我曾经的Android应用开发(二)

 
阅读更多

以前做Android开发的时候没怎么做笔记,也没写博客,有什么需要记的东西都是这个word放一点,那个txt放一点,现在都不知道到哪里找了,不过总归还是找到一两个word,整理了一下,便有了这篇文章,其中有自己的一些领悟,也有从互联网上摘抄的东西。

(一)关于Activity的启动问题:

1、Activity从创建到进入运行态所触发的事件onCreate()-->onStart()-->onResume()

2、从运行态到停止态所触发的事件 onPause()--->onStop()

3、从停止态到运行态所触发事件 onRestart()-->onStart()--->onResume()

4、从运行态到暂停态所触发事件 onPause()

5、从暂停态到运行态所触发事件 onResume()

(二)关于Service启动问题

使用intent.startService() 启动Service: Service与Activity没有关系,也没有通信,就算Activity退出了,Service可能还在。

intent.startService() ->onCreate()- >onStartCommand()->Service running
intent.stopService() | ->onDestroy() ->Service stop 
使用intent.bindService()启动Service:Service与Activity有通信

intent.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop


(三)关于Notification通知

Notification就是手机上方经常出现的通知,由于Notification可以与应用程序脱离。也就是说,即使应用程序被关闭,Notification仍然可以显示在状态栏中。就像短信应用没有启动,但是手机上方会出现通知。当应用程序再次启动后,又可以重新控制这些Notification。如清除或替换它们。因此,需要创建一个PendingIntent对象。该对象由Android系统负责维护,因此,在应用程序关闭后,该对象仍然不会被释放。这里说一下PendingIntent和Intent的区别:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc.

(四)关于程序数据类型

Sqlite只支持null,integer,real,text和blob(二进制对象)数据类型,也兼容其他的varchar等等,但实际上在运算的时候会自动转换为五种类型,特点:保存任何类型的数据到任何字段中

(五)关于webwiew

在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:

onLoadResource 
onPageStart 
onPageFinish 
onReceiveError 
onReceivedHttpAuthRequest 

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

onCloseWindow(关闭WebView)
 onCreateWindow() 
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出) 
onJsPrompt 
onJsConfirm 
onProgressChanged 
onReceivedIcon 
onReceivedTitle

关于webview打开文件的写法:

webView.loadUrl("file:///android_asset/index.html"); -----打开本包内asset目录下的index.html文件 
webView.loadUrl("content://com.android.hello/sdcard/index.html");-----打开本地sd卡内的index.html文件

android能操作文件夹只有两个地方:
1.sdcard
2./data/<package_name>/
详见apidoc:
docs/guide/topics/data/data-storage.html#filesExternal

Environment.getRootDirectory()是得到系统/System目录

Environment.getExternalStorageState()是得到系统/Sdcard目录,需要判断是否有Sdcard

Environment.getDataDirectory()是得到/Data目录;


WebView加载网页时前面的那一段空白怎么填补?Toast不能定义时间,所以不行,会在加载没有完成的时候就灭了。可以在背景用一个View试试。每次加载开始时就让WebView消失而View显示。

关于网页加载进度提示的问题:

Toast提示网页加载进度可以在WebViewClient.onPageStart方法里面设置开始show,在WebChromeClient.onProgressChanged方法里面progress==100的时候结束cancel,其中设置WebChromeClient有如下方法webView.setWebChromeClient(WebChromeClient).

(六)关于程序意外退出后的保存问题

当你的程序中某一个ActivityA在运行时中,主动或被动地运行另一个新的ActivityB ,这个时候A会执行:

public
void onSaveInstanceState(Bundle outState) {   
    super.onSaveInstanceState(outState);   
    outState.putLong("id", 1234567890);   
}   

B完成以后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

if(savedInstanceState != null){   
     long id = savedInstanceState.getLong("id");   
}   

if(savedInstanceState != null){     long id = savedInstanceState.getLong("id");}

就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个noteid记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...

(七)关于摄像头

摄像头的实现有CameraSurfaceViewSurfaceHolder,SurfaceHolder.Callback,PictureCallbackCamera.ParametersDisplay

首先SurfaceView相当于那个画面,也就是取景框。而设置SurfaceView需要一个SurfaceHolder,Camera通过setPreviewDisplay(SurfaceHolder)的方法来连接SurfaceHolder并通过它来控制SurfaceViewSurfaceHolder.CallbackSurfaceHolder用来显示SurfaceView数据的接口,它实现了三个方法:

surfaceCreated()SurfaceView被创建时调用。

surfaceChanged()SurfaceView发生改变时调用.

surfaceDestroyed()surfaceView销毁时进行调用.

SurfaceHolder通过addCallBack()方法将相应的接口绑定到它身上.

PictureCallbackCamera调用拍照方法takePicture(,,PictureCallback)的接口类,拍照的数据就在这个类里面的OnPictureTake()方法里面实现,对照片数据进行解析和存储。

Camera.Parameters是对Camera的一些拍照参数进行设置,如照片大小,照片格式等等。

Display是得到系统屏幕的一些参数.用来设置Camera的参数跟系统屏幕符合,如照片大小是否跟系统屏幕一样大.

默认情况下照相机的取景方向是向左旋转90°的。只设置orientation屏幕能转过来,但是拍出来的照片还是向左旋转90°的。

parameters.set("orientation","portrait");//"portrait"是竖向,仅仅是试图的方向

parameters.setRotation(90);//应该是旋转找出来的照片方向

相机旋转依赖于不同的设备和不同的版本,下面是一个国外论坛比较经典的总结(http://code.google.com/p/android/issues/detail?id=1193#c42):

Version1.6:tofixtheRotationIssue,anditisgoodformostofdevices

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)   {       
    p.set("orientation", "portrait");      p.set("rotation",90);    }   
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)    {                    
  p.set("orientation", "landscape");         
  p.set("rotation", 90);   
 }

Version2.1:dependonkindofdevices,forexample,CanntfixtheissuewithXPeriaX10,butitisgoodforX8,andMini

Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
camera.setParameters(parameters);

Version2.2:notforalldevices

camera.setDisplayOrientation(90);


在做照相机程序的时候,一直不知道怎么在SurfaceView里面添加按钮,SurfaceView一般是全屏显示的,下面的FrameLayout是重点

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
      <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" 
            >
  <SurfaceView
  android:id="@+id/surfaceView"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  </SurfaceView>
    </FrameLayout> 
    <LinearLayout android:id="@+id/LinearLayout01"  
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
android:orientation="horizontal">   
        <Button android:id="@+id/Button02" android:layout_width="wrap_content"  
            android:layout_height="wrap_content" android:layout_weight="1" android:text="返
回"></Button>  
    </LinearLayout>
</LinearLayout>

布局的问题:如果是两个空间来平分宽度,就用LinearLayout,然后两个控件都设置layout_weight=1,这样就可以很好的平分宽度了;如果三个平分的话就在中间那个控件单独弄一个LinearLayout或者其他的layout,这个layoutandroid:layout_weight="1"

,这样的话这个layout就有2/3的宽度,然后反正这个layout里面的控件设置属性android:layout_centerInParent="true"就能够在中间了


关于图像裁剪:

调用系统裁剪图片的主要代码是下面这些代码,这里不能设置得到哪些图片,应该是得到所有的图片,裁剪后可以自己设置路径和文件名

Intent intent = new Intent("com.android.camera.action.CROP"); 
intent.setDataAndType(photoUri, "image/*"); 
intent.putExtra("crop", "true"); //crop=true有这句才能出来最后的裁剪页面.

intent.putExtra("aspectX", 1);

intent.putExtra("aspectY", 1); intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); intent.putExtra("output", Uri.fromFile(tempFile)); intent.putExtra("outputFormat", "JPEG"); startActivityForResult(intent, requestCode);


(八)关于GPS

只有启用了这个函数LocationManager.requestLocationUpdates(……);GPs才会起作用,这是一个请求更新函数,里面有一个监听器的参数,能够监听到位置的改变。

android的位置提供有两个,gpsnetwork,其中network包括wifi和基站等网络方式,gps每次获取的位置一般都是不同的,network获取的经纬度在一般很少改变,如果从wifi切换到移动网络,则获取的经纬度会发生变化,反之从移动网络切换到wifi,获取的经纬度也会发生变化,但是如果一直在移动网络,或者一直在wifi网络,则获取的经纬度在几次之内是很少会改变的。当然如果从一个wifi热点切换到另一个wifi热点,获取的经纬度肯定会变化。不变化的是在一个wifi热点内的周围移动获取的经纬度是基本不变的。在不同网络切换到时候获取的经纬度可能在一段时间内会变化,但最终会趋于稳定。例如:

我一开始用wifi获取的是23.0984789--113.3162901wifi),之后关闭wifi,获取的是23.0981123--113.3154123(基站),(中间还有一两个其他的值,也可以没有)最后趋于23.0981189--113.3154709(基站),开启wifi后,得到23.0984123--113.3162123wifi),(中间还有几个值,也可以没有),最后趋于23.0984789--113.3162901wifi),注意到最后趋于稳定的值都是一样的。

(九)关于游戏开发

1被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于onTouch来更新,可以直接使用invalidate。因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。

2surfaceview中确实有onDraw这个方法,但是你surfaceview不会自己去调用!!!放在线程中不断调用的,一定要注意!!在继承view中,因为onDraw方法是系统自动调用的,不像在surfaceview这里这样去在run里面自己去不断调用,在view中我们可以抵用invalidate()/postInvalidate()这两种方法实现让系统调用onDraw方法,这里也是和surfaceview中的不同之一!

3这里canvas.save();canvas.restore();是两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的。这里稍微解释一下,当我们对画布进行旋转,缩放,平移等操作的时候其实我们是想对特定的元素进行操作,比如图片,一个矩形等,但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布上的元素都会受到影响,所以我们在操作之前调用canvas.save()来保存画布当前的状态,当操作之后取出之前保存过的状态,这样就不会对其他的元素进行影响


(十)其他知识点

1)Android基于http上传文件到服务器端要分析文件的流格式,自己来组装流格式来发送到服务器端。在服务器端通过开源的一个组件commonsfileupload来实现文件流的解析。

2)真机和模拟器访问本机都是用10.0.2.2,因为127.0.0.1是模拟器本身的地址。但是如果是真机测试,则服务器的地址就是本机自己的ip地址

3)要想监听电话的来电状态,信号强度等,可以通过TelephonyManager来实现,具体是得到一个电话管理器对象TelephonyManager,然后通过listen()方法设置相应的器PhoneStateListener来监听电话的各种状态.PhoneStateListener是里面有相应的回调函数,如OnSignaStrengthsChanged()方法是当电话的强度改变时就会调用。





分享到:
评论

相关推荐

    android应用开发范例精解

    《Android应用开发范例精解》通过通俗易懂的开发实例及项目案例,详细介绍了Android应用开发的知识体系及实用开发技术。 《Android应用开发范例精解》共14章,分为3篇。第1篇为基础篇,涵盖Android背景及开发环境和...

    Android移动应用开发习题答案.pdf

    Android 移动应用开发习题答案 Android 移动应用开发是指使用 Android 操作系统开发移动应用程序的过程。 Android 作为最流行的移动操作系统之一,拥有庞大的用户群体和丰富的第三方应用程序生态系统。为了帮助...

    《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf

    《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用...

    《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf

    《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf《Android应用程序开发教程(第2版)》教学课件01Android系统与开发...

    \Android应用开发

    \Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android应用开发\Android...

    android 嵌入式应用开发第二版

    android 嵌入式应用开发第二版 好不容易找到了 分享下 甩的百度云链接

    Android应用开发揭秘-pdf(全)

    根据提供的信息,我们可以推断出《Android应用开发揭秘》这本书主要涵盖了Android应用程序的开发流程及相关技术,适合初学者作为入门指南。尽管具体内容未给出详细章节或摘要,但基于标题、描述及常见Android开发...

    《Android应用开发详解》源码

    《Android应用开发详解》源码,完整版,值得看一看。 《Android核心技术和开发详解》各章案例的全部源代码,第一章将要介绍的是Android开发起步的相关知识,首先对Android平台进行简单的介绍,其中包括Android的背景...

    Android应用开发,完整扫描版

    《Android应用开发》通过丰富而翔实的实例展示了在Android平台下开发手机应用软件所必需的概念和技术。书中不仅对Android应用程序的开发环境和调试方法进行了详细介绍,而且对Android软件开发的一些关键技术和API...

    ANDROID应用开发范例大全

    165个经典实例,深入阐释Android应用开发精髓, 本书采用实例教学的方式,以 165个经典应用范例的实现过程,详细讲解了开发各类 Android应用程序的方法和技巧。, 本书共有 14章,从 UI界面布局实战开始讲起,依次讲解...

    Android应用开发完全自学手册

    《Android应用开发完全自学手册》是一本全面介绍Android应用开发的指南,涵盖了从基础到进阶的各个环节。这本书旨在帮助初学者系统地学习并掌握Android应用的开发技能,通过源代码解析来提升实践能力。 第1章:...

    Android应用开发详解+原书代码.rar(完整版)

    作为一本Android应用开发书籍,本书既适合Android初学者,也适合具备了一定Android开发经验丹需要开发案例的高级读者。 本书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。 本书基础翔实,...

    Android Studio移动应用开发PPT详解(微课版)

    Android手机系统是Google推出的一个基于Linux的操作系统,目前市场占有率很高,而Android应用开发则是通过使用Android软件开发套件(Android Software Development Kit,简称Android SDK)的工具和技术,制作各种...

    3G手机Android应用开发系列视频教程

    编码实现软件界面【】3G手机Android应用开发第二天课程1.单元测试与输出日志信息【】3G手机Android应用开发第二天课程4.采用SAX解析XML-1【】3G手机Android应用开发第二天课程5.采用SAX解析XML-2【】3G手 资源太大,...

    《Android嵌入式应用开发 (第2版)》

    《卓越工程师培养计划"十二五"规划教材:Android嵌入式应用开发》主要内容包括Android基础知识、Android应用程序开发的基本流程、Android应用程序开发的常用编程接口、常用控件及一些在应用程序中常用的模块和功能的...

    Android 应用案例开发大全3.part03.rar

    主要以范例的方式来讲述Android的应用开发,详细介绍了3D动态壁纸、LBS类应用、导航与百度地图二次开发、理财类应用、餐饮行业应用、校园辅助应用、音乐休闲应用、新闻发布管理应用、休闲益智类3D/2D游戏等各类...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    Android应用开发详解(PDF+全部的源代码)

    《Android应用开发详解》这本书是Android开发者的重要参考资料,它涵盖了从基础到高级的全面知识,旨在帮助读者深入理解和掌握Android应用程序的设计与实现。书中不仅有详尽的理论讲解,还附带了完整的源代码,方便...

    深入Android应用开发:核心技术解析与最佳实践

    深入Android应用开发:核心技术解析与最佳实践

Global site tag (gtag.js) - Google Analytics