当前位置:  编程技术>移动开发
本页文章导读:
    ▪收拾及中常用的获取位置信息的方法        整理及中常用的获取位置信息的方法 (1)一般来讲,通过gps获取到经纬度坐标以后,要继续深入的获取该经纬度坐标的城市、街道与精度(误差)等信息。 private String getAddressbyGeoPoint() {/.........
    ▪ 反正屏切换时候Activity的生命周期(zz)        横竖屏切换时候Activity的生命周期(zz)   曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期。现在给大家分析一下他切换时具体的生命周期是怎么样的: 1、新建一个Activity,.........
    ▪ ContentProvider学习札记       ContentProvider学习笔记 一、首先要明白,ContentProvider(以下简称为CP)是什么。1,是一套数据存储和获取的统一接口。2,最大的特点是,可以在不同的应用程序间共享数据。3,Android系统自.........

[1]收拾及中常用的获取位置信息的方法
    来源: 互联网  发布时间: 2014-02-18
整理及中常用的获取位置信息的方法
(1)

一般来讲,通过gps获取到经纬度坐标以后,要继续深入的获取该经纬度坐标的城市、街道与精度(误差)等信息。



private String getAddressbyGeoPoint() {

// 自经纬度取得地址

StringBuilder sb = new StringBuilder();

Geocoder gc = new Geocoder(getBaseContext(), Locale.getDefault());

List<Address> lstAddr = null;

try {

lstAddr = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1);

} catch (IOException e) {

Log.e("HangzhouBike", e.getMessage());

}

if (lstAddr != null && lstAddr.size() > 0) {

Address addr = lstAddr.get(0);

if (addr.getAddressLine(1) != null) {

sb.append(addr.getAddressLine(1)).append(" ");

}

if (addr.getAddressLine(2) != null){

sb.append(addr.getAddressLine(2)).append(" ");

sb.append(" ±" + location.getAccuracy() + "米");

}、

}

return sb.toString();

}

(2)

Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。

首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是不被允许的。

Java代码
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

得到了LocationManager的实例locatonManager以后,我们通过下面的语句来注册一个周期性的位置更新。

Java代码
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,   
1000, 0, locationListener);  
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 0, locationListener);

这句代码告诉系统,我们需要从GPS获取位置信息,并且是每隔1000ms更新一次,并且不考虑位置的变化。最后一个参数是LocationListener的一个引用,我们必须要实现这个类。

Java代码
private final LocationListener locationListener = new LocationListener() {   
    public void onLocationChanged(Location location) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发   
        // log it when the location changes   
        if (location != null) {   
            Log.i("SuperMap", "Location changed : Lat: "  
              + location.getLatitude() + " Lng: "  
              + location.getLongitude());   
        }   
    }   
  
    public void onProviderDisabled(String provider) {   
    // Provider被disable时触发此函数,比如GPS被关闭   
    }   
  
    public void onProviderEnabled(String provider) {   
    //  Provider被enable时触发此函数,比如GPS被打开   
    }   
  
    public void onStatusChanged(String provider, int status, Bundle extras) {   
    // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数   
    }   
};  
private final LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
        // log it when the location changes
        if (location != null) {
            Log.i("SuperMap", "Location changed : Lat: "
              + location.getLatitude() + " Lng: "
              + location.getLongitude());
        }
    }

    public void onProviderDisabled(String provider) {
    // Provider被disable时触发此函数,比如GPS被关闭
    }

    public void onProviderEnabled(String provider) {
    //  Provider被enable时触发此函数,比如GPS被打开
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
    }
};

以上的这些步骤一般应当在Activity的onCreate()阶段完成。

在成功注册了一个周期性坐标更新以后,我们就随时可以通过下面的方法来取得当前的坐标了。

Java代码
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);   
double latitude = location.getLatitude();     //经度   
double longitude = location.getLongitude(); //纬度   
double altitude =  location.getAltitude();     //海拔  
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double latitude = location.getLatitude();     //经度
double longitude = location.getLongitude(); //纬度
double altitude =  location.getAltitude();     //海拔

不过这时候,如果你尝试去运行这个LocationSample的话程序启动时多半就会报错,因为我们没有设置GPS相关的权限,解决方法也相当简单,在AndroidManifest.xml中的block里添加下面这句即可解决权限的问题。详细的权限设置,请参考官方文档docs/reference/android/Manifest.permission.html

Java代码
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
(3)

locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);

provider = locationManager.getBestProvider(criteria,true);
if (provider != null) {
location = locationManager.getLastKnownLocation(provider);
/* TODO - adjust update times to minimize battery use. Can be changed as needed.
*
*/
locationManager.requestLocationUpdates(provider,
60000, // 1min
100, // 100m
locationListener);
}

Obviously you don't need to request location updates, but if you do then below is some code I use....


private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location newloc) {
// something to do here when location changes
// TODO get other datq (accuracy, velocity, altitude, etc...)
// write data to database
// add markers
location = newloc;

}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};

and you need to remember to turn off/on the updating at onStart and onStop

@Override
public void onStop() {
super.onStop();
if (provider != null) {
locationManager.removeUpdates(locationListener);
}


@Override
public void onStart() {
super.onStart();

/* recheck which provider to use */
provider = locationManager.getBestProvider(criteria,true);
if (provider != null) {
location = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider,
60000, // 1min
100, // 100m
locationListener);
}

}


    
[2] 反正屏切换时候Activity的生命周期(zz)
    来源: 互联网  发布时间: 2014-02-18
横竖屏切换时候Activity的生命周期(zz)

 

曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期。现在给大家分析一下他切换时具体的生命周期是怎么样的:

1、新建一个Activity,并把各个生命周期打印出来

2、运行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

3、按crtl+f12切换成横屏时

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->

7、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged

onConfigurationChanged-->

8、执行步骤4

onConfigurationChanged-->
onConfigurationChanged-->

 总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

 


总结一下整个Activity的生命周期

补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop       onRestart -->onStart--->onResume

Activity未被完全覆盖只是失去焦点:onPause--->onResume

 


    
[3] ContentProvider学习札记
    来源: 互联网  发布时间: 2014-02-18
ContentProvider学习笔记
一、首先要明白,ContentProvider(以下简称为CP)是什么。
1,是一套数据存储和获取的统一接口。
2,最大的特点是,可以在不同的应用程序间共享数据。
3,Android系统自身已经提供数个CP,包括音频、视频、通讯录的数据。
4,如第一条所说,CP是一套数据存储和获取的接口。所以有不同的实现,其中最常见的是使用SQLite的实现,数据被保存在一张表中。
5,CP需要向外部提供一个唯一的Uri(统一资源标识符),来标明资源的位置。该Uri的格式为:
content://xxx.yyy.zzz/aaa其中红色部分为统一的,表示协议、
xxx.yyy.zzz被称为authority,是一个唯一的字符串,按doc推荐,通常采用项目的包名、
蓝色部分/aaa被称为PathSegments,表示该资源更确切的位置,是一个目录结构。某些时候,可以将其理解为一张表。

二、自定义CP不是很有必要,除非应用需要向外部共享数据。一般都是使用Android系统提供的CP。

三、自定义CP的实现方法。
此处采用常见的SQLite方式实现。

1,书写一个类,继承android.content.ContentProvider,该类是抽象类,需要实现以下的方法:
  • boolean onCreate():很明显,该方法作为CP创建时由系统调用的方法,通常执行初始化操作。
  • Uri insert(Uri uri, ContentValues values):插入数据的方法,返回最新插入数据的Uri。
  • int delete(Uri uri, String selection, String[] selectionArgs):删除数据的方法,返回操作影响行数。
  • int update(Uri uri, ContentValues values, String selection,String[] selectionArgs):更新数据的方法,返回操作影响行数。
  • Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder):查询数据的方法,返回包含数据的游标对象。
  • String getType(Uri uri):取得该uri的MIME类型,返回表示MIME类型的字符串。

  • 从以上方法的参数可见,确实用SQLite的相关API来实现CP是很合适的。

    2,自定义CP必要的内容。
  • authority:确定了该CP的唯一性,Uri的必要组成部分,以常量的形式定义。同时需要在AndroidManifest.xml中进行配置。
  • eg:
    public static final String AUTHORITY = "org.ashtray.todolist";
  • uri:该CP的资源定位,以常量的形式定义。一个CP允许有多个Uri,以PathSegment进行区分和定位。
  • eg:
    public static finalUri URI_1 = Uri.parse("content://" + AUTORITY + "/location_1");

    最后的字符串location_1即为PathSegment。
  • 需要一个定义一个android.content.UriMatcher常量。在静态块中进行初始化。
  • eg:
    public static final UriMatcher matcher = null;
    public static final int TODOS = 0;
    public static final int TODO = 1;
    
    static{
         matcher = new UriMatcher(UriMatcher.NO_MATCH);
         //为matcher添加映射,用于过滤uri,
          //todolist,todolist/#为uri的形式,
          //TODOS,TODO未定义的两个整型常量,用于标识该类型的uri
         matcher.addURI(AUTHORTY, "todolist", TODOS);
         matcher.addURI(AUTHORTY, "todolist/#",  TODO);
    }
    
  • 以字符串常量的形式定义该CP拥有的MIME类型,通常需要定义两个,表示单条数据的MIME类型和复数条数据的MIME类型。
  • eg:
    public static final String CONTENT_ITEMS_TYPE= "vnd.android.cursor.dir/vnd.ashtray.todolist";
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ashtray.todolist";
    

    vnd.android.cursor.item:固定的,表示单条数据。
    vnd.android.cursor.dir:固定的,表示复数数据。
    “/”之后为自定义,可随意。
  • 一个静态常量Map<String,String>,用于描述数据存储的结构,可以理解为描述表结构。即有哪些列和列的别名。
  • 此段内容在下在学习中也不甚懂,不知有什么必要,此处只姑且写出通常推荐的作法。
    public static final Map<String,String> projectionMap = null;
    static {
          projectionMap = new HashMap<String,String>();
          projectionMap.put("col_1","col_1"); 
          projectionMap.put("col_2","col_2"); 
          projectionMap.put("col_3","col_3"); 
    }
    


    3,几个重点方法的实现。
  • String getType(Uri uri)
  • 此方法主要的作用在于根据uri返回该uri所对应的数据MIME类型。
             @Override
    	public String getType(Uri uri) {
                      //UriMatcher对象的match方法,获取uri对应的int型标识
                         //该映射关系需要用首先用matcher.addURI进行添加
    		switch (matcher.match(uri)) {
                               
    			case Const.TODO:
                                        //返回uri对应的MIME类型
    				return Const.CONTENT_ITEM_TYPE;
    			case Const.TODOS:
    				return Const.CONTENT_ITEMS_TYPE;
    			default:
    				return null;
    		}
    	}
    

    个人认为,该方法的作用在于,在查询方法中判断是查询单条数据还是多条数据以作不同处理。如果是查询单条数据,即可从uri中取出所要查询数据的id
    //以List<String>的形式返回authority之后的内容,以“/”隔开
    String id = uri.getPathSegments().get(1)
    

  • Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder),查询方法
  • @Override
    	public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) 
    {
                      //通过SQLiteOpenHelper的实现类,获取数据库对象
    		SQLiteDatabase db = helper.getReadableDatabase();
    
    		//根据uri取得查询内容的MIME类型
    		String mime = this.getType(uri);
    
                      //创建查询
    		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    		//设置描述数据结构的Map
                      qb.setProjectionMap(getProjection(projection));
    		
                      //如果MIME类型为查询单条数据,则从uri中取出数据的id,并添  加为查询的条件
    		if(Const.CONTENT_ITEM_TYPE.equalsIgnoreCase(mime)){
    			qb.appendWhere(Const.COL_ID + "=" + uri.getPathSegments().get(1));
    		}
                      //设置查询的表
    		qb.setTables(Const.TABLE_NAME);
                      //执行查询,并返回Cursor对象
    		Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
                      //设置更新通知,以获取最新的数据
             cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
    		return cursor;
    	}
    

  • Uri insert(Uri uri, ContentValues values),插入数据方法。
  • SQLiteDatabase db = this.helper.getWritableDatabase();
    		long id = db.insert(Const.TABLE_NAME, null, values);
    		
    		if(id < 0){
    			throw new SQLException("insert field");
    		}
    		
    		//将插入数据的id添加到Uri并返回
    		Uri curr = ContentUris.withAppendedId(Const.TODO_LIST_URI, id);
                      //将新插入的数据uri进行通知,以便获取最新的数据
    		this.getContext().getContentResolver().notifyChange(curr, null);
    		return curr;
    


    4,Activity中使用CP。
    首先需要在AndroidManifest.xml中对自定义CP进行注册,
    eg:
      <provider
                      <!--自定义CP的类全名-->
       	android:name="org.ashtray.cp.TodoListContentProvider" 
             <!--authority,自定义CP的唯一标识,与代码中定义的字符串相同-->
        		android:authorities="org.ashtray.todolist"/>
    

    自定义CP在应用启动时,由系统实例化(调用CP的onCreate方法,并且会实例化所有注册了的CP),在Activity中通过ContentResolver来操作自定义CP。
    而对于查询,则调用Activty的mangedQuery方法。
    或者ContentResolver的query方法。

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    ▪Android中通过view方式获取当前Activity的屏幕截... iis7站长之家