文档章节

Android 小知识

l
 lht1234
发布于 2016/02/17 15:04
字数 2173
阅读 5
收藏 0

    二:升级弹窗 对话框

    三:跳转系统安装页面:用于新版本下载后,直接跳转到安装页面

四:手势识别器

五:电话管理器获取SIM卡序列号

六: 读取联系人数据

七:手机定位

八:选择联系人记录

二:升级弹窗 对话框:

    /**

     * 升级弹窗

     */

    protected void showUpdateDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);// 这里必须传一个activity对象

        builder.setTitle("发现新版本:" + mVersionName);

        builder.setMessage(mDes);

        // builder.setCancelable(false);//不可取消,点返回键弹窗不消失, 尽量不要用,用户体验不好

        builder.setPositiveButton("立即更新",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        downloadApk();

                    }

                });

        builder.setNegativeButton("以后再说",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        enterHome();

                    }

                });

        // 用户取消弹窗的监听,比如点返回键

        builder.setOnCancelListener(new OnCancelListener() {

            @Override

            public void onCancel(DialogInterface dialog) {

                enterHome();

            }

        });

        builder.show();

    }


三:跳转系统安装页面:用于新版本下载后,直接跳转到安装页面

             PackageManager pm = getPackageManager();// 包管理器

            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);// 根据包名,获取相关信息

            String versionName = packageInfo.versionName;// 版本名称

            int versionCode = packageInfo.versionCode;// 版本号

           


                    // 跳转系统安装页面

                    Intent intent = new Intent();

                    intent.setAction(Intent.ACTION_VIEW);

                    intent.addCategory(Intent.CATEGORY_DEFAULT);

                    intent.setDataAndType(Uri.fromFile(responseInfo.result),

                            "application/vnd.android.package-archive");

                    startActivityForResult(intent, 0);  

startActivityForResult(intent, 0);  

//可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,

//而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。  

四:手势识别器


mDetector = new GestureDetector(this,

                new GestureDetector.SimpleOnGestureListener() {

                    /**onFling:Touch了滑动一点距离后,up时触发。 

                     * 快速滑动,抛 e1: 起点坐标 e2: 终点坐标 velocityX: 水平滑动速度 velocityY:

                     * 竖直滑动速度

                     */

                    @Override

                    public boolean onFling(MotionEvent e1, MotionEvent e2,

                            float velocityX, float velocityY) {

                        if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) {// 竖直方向滑动范围太大

                            ToastUtils.showToast(getApplicationContext(), "不能这样划哦!");

                            return true;

                        }

                        if (Math.abs(velocityX) < 100) {

                            ToastUtils.showToast(getApplicationContext(), "滑动太慢了哦!");

                            return true;

                        }

                        // 判断向左划还是想右划

                        // e1.getX();//相对父控件的x坐标

                        // e1.getRawX();//屏幕的绝对坐标

                        if (e2.getRawX() - e1.getRawX() > 200) {// 向右划,上一页

                            System.out.println("上一页");

                            showPrevious();

                            return true;

                        }

                        if (e1.getRawX() - e2.getRawX() > 200) {// 向左划, 下一页

                            System.out.println("下一页");

                            showNext();

                            return true;

                        }

                        return super.onFling(e1, e2, velocityX, velocityY);

                    }

                });  




    @Override

    public boolean onTouchEvent(MotionEvent event) {

        mDetector.onTouchEvent(event);// 将事件委托给手势识别器处理

        return super.onTouchEvent(event);

    }  


注:GestureDetector类 对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类 SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个 更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。

OnGestureListener有下面的几个动作:

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。

抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。

长按(onLongPress): 手指按在持续一段时间,并且没有松开。

滚动(onScroll): 手指在触摸屏上滑动。

按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

抬起(onSingleTapUp):手指离开触摸屏的那一刹那。



在View中设置手势有两点需要注意:

1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势。

2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作。


  •  mDetector = new GestureDetector(context, new MyGestureListener());  

  •         setLongClickable(true);  

  •         this.setOnTouchListener(new OnTouchListener() {  

  •               

  •             @Override  

  •             public boolean onTouch(View v, MotionEvent event) {  

  •                 return mDetector.onTouchEvent(event);  

  •             }  

  •         }); 
     

五:电话管理器获取SIM卡序列号:

            // 初始化电话管理器

           TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

            String simSerialNumber = tm.getSimSerialNumber();// 获取sim卡序列号,需要权限:android.permission.READ_PHONE_STATE  



六: 读取联系人数据

    /**

     * 读取联系人数据 需要权限:android.permission.READ_CONTACTS

     */

    private ArrayList<HashMap<String, String>> readContact() {

        // raw_contacts, data, mimetypes

        // 1. 先从raw_contacts中读取联系人的contact_id

        // 2. 根据contact_id,从data中查出联系人相关信息

        // 3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)

        Cursor rawContactCursor = getContentResolver().query(

                Uri.parse("content://com.android.contacts/raw_contacts"),

                new String[] { "contact_id" }, nullnullnull);

        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();// 所有联系人集合

        while (rawContactCursor.moveToNext()) {// 遍历所有联系人

            String contactId = rawContactCursor.getString(0);

            // 系统查询的不是data这个表,而是view_data这个视图,视图是多个表的整合, data+mimetypes

            Cursor dataCursor = getContentResolver().query(

                    Uri.parse("content://com.android.contacts/data"),

                    new String[] { "data1""mimetype" }, "raw_contact_id=?",

                    new String[] { contactId }, null);

            HashMap<String, String> map = new HashMap<String, String>();// 保存某个联系人的信息

            while (dataCursor.moveToNext()) {// 遍历单个联系人所有字段信息

                String data = dataCursor.getString(0);

                String type = dataCursor.getString(1);

                if ("vnd.android.cursor.item/phone_v2".equals(type)) {

                    // 电话号码

                    map.put("phone", data);

                } else if ("vnd.android.cursor.item/name".equals(type)) {

                    // 名称

                    map.put("name", data);

                }

            }

            dataCursor.close();

            // 脏数据, 过滤掉

            if (!TextUtils.isEmpty(map.get("name"))

                    && !TextUtils.isEmpty(map.get("phone"))) {

                list.add(map);

            }

        }

        rawContactCursor.close();

        return list;

    }  



七:手机定位

/**

 * 需要权限: <uses-permission

 * android:name="android.permission.ACCESS_COARSE_LOCATION"/>//网络定位

 * <uses-permission

 * android:name="android.permission.ACCESS_FINE_LOCATION"/>//GPS定位

 * <uses-permission

 * android:name="android.permission.ACCESS_MOCK_LOCATION"/>//模拟器模拟位置

 * 

 * 百度地图 开放平台

 * gps + wifi + 3g

 *  

 */

public class MainActivity extends Activity {

    private LocationManager mLM;

    private MyListener mListener;

    private TextView tvResult;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tvResult = (TextView) findViewById(R.id.tv_result);

        // 位置管理器

        mLM = (LocationManager) getSystemService(LOCATION_SERVICE);

        List<String> allProviders = mLM.getAllProviders();// 获取所有位置提供者

        System.out.println(allProviders);

        mListener = new MyListener();

        mLM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,

                mListener);// 请求位置更新, 参1:位置提供者,参2:最短更新时间,参3:最短更新距离;参4:位置监听;

                            // 参2参3改为0,表示只要位置变化,就马上更新

    }

    class MyListener implements LocationListener {

        // 位置发生变化

        @Override

        public void onLocationChanged(Location location) {

            String j = "经度:" + location.getLongitude();

            String w = "纬度" + location.getLatitude();

            String accuracy = "精确度:" + location.getAccuracy();

            String altitude = "海拔:" + location.getAltitude();

            String result = j + "\n" + w + "\n" + accuracy + "\n" + altitude;

            tvResult.setText(result);

        }

        // 状态发生变化

        @Override

        public void onStatusChanged(String provider, int status, Bundle extras) {

            System.out.println("onStatusChanged");

        }

        // 用户打开GPS

        @Override

        public void onProviderEnabled(String provider) {

            System.out.println("onProviderEnabled");

        }

        // 用户关闭GPS

        @Override

        public void onProviderDisabled(String provider) {

            System.out.println("onProviderDisabled");

        }

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        // 停止位置监听

        mLM.removeUpdates(mListener);

        mListener = null;

    }

}


八:选择联系人记录


public class MainActivity extends Activity {

    private ListView lvContact;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        lvContact = (ListView) findViewById(R.id.lv_contact);

        ArrayList<HashMap<String, String>> list = readContact();

        lvContact.setAdapter(new SimpleAdapter(this, list,

                R.layout.list_item_contactnew String[] { "name""phone" },

                new int[] { R.id.tv_name, R.id.tv_phone }));

    }

    /**

     * 读取联系人数据 需要权限:android.permission.READ_CONTACTS

     */

    private ArrayList<HashMap<String, String>> readContact() {

        // raw_contacts, data, mimetypes

        // 1. 先从raw_contacts中读取联系人的contact_id

        // 2. 根据contact_id,从data中查出联系人相关信息

        // 3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)

        Cursor rawContactCursor = getContentResolver().query(

                Uri.parse("content://com.android.contacts/raw_contacts"),

                new String[] { "contact_id" }, nullnullnull);

        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();// 所有联系人集合

        while (rawContactCursor.moveToNext()) {// 遍历所有联系人

            String contactId = rawContactCursor.getString(0);

            // 系统查询的不是data这个表,而是view_data这个视图,视图是多个表的整合, data+mimetypes

            Cursor dataCursor = getContentResolver().query(

                    Uri.parse("content://com.android.contacts/data"),

                    new String[] { "data1""mimetype" }, "raw_contact_id=?",

                    new String[] { contactId }, null);

            HashMap<String, String> map = new HashMap<String, String>();// 保存某个联系人的信息

            while (dataCursor.moveToNext()) {// 遍历单个联系人所有字段信息

                String data = dataCursor.getString(0);

                String type = dataCursor.getString(1);

                if ("vnd.android.cursor.item/phone_v2".equals(type)) {

                    // 电话号码

                    map.put("phone", data);

                } else if ("vnd.android.cursor.item/name".equals(type)) {

                    // 名称

                    map.put("name", data);

                }

            }

            dataCursor.close();

            // 脏数据, 过滤掉

            if (!TextUtils.isEmpty(map.get("name"))

                    && !TextUtils.isEmpty(map.get("phone"))) {

                list.add(map);

            }

        }

        rawContactCursor.close();

        return list;

    }

}  

九:overridePendingTransition: 两个activity之间切换的动画, 必须在startActivity()或者 finish()方法的后面


         startActivity(new Intent(this, Setup2Activity.class));
        finish();
        // 两个activity之间切换的动画, 必须在startActivity()或者 finish()方法的后面。

        overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);  



            一 :Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。

          它包括两个部分:

               一部分是第一个activity退出时的动画,另外一部分时第二个activity进入时的动画;

               在Android的2.0版本之后,有了一个函数来帮我们实现这个动画。这个函数就是overridePendingTransition

                这个函数有两个参数,一个参数是第一个activity进入时的动画,另外一个参数则是第二个activity退出时的动画。

                这里需要特别说明的是,关于overridePendingTransition这个函数,有两点需要主意

                1.它必需紧挨着startActivity()或者finish()函数之后调用"

                2.它只在android2.0以及以上版本上适用  

            二:  不过有时候overridePendingTransition 这个函数会不起作用,总结下,大概是以下三个方面的原因:

            

             1、android系统版本2.0以下,这个没办法,想其他办法解决切换动画吧。

             2、在ActivityGroup等的嵌入式Activity中,这个比较容易解决,用如下方法就可以了:

                this.getParent().overridePendingTransition 就可以解决。

             3、在一个Activity的内部类中,或者匿名类中,这时候只好用handler来解决了。

             4、手机的显示动画效果被人为或者其他方式给关闭了 现在打开即可 设置->显示->显示动画效果  


© 著作权归作者所有

l
粉丝 0
博文 2
码字总数 2734
作品 0
崇明
私信 提问
Android学习攻略:手把手教你循序渐进地学习Android知识

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”。 所以,今天,我将献上一份《Android学习指南》,...

Carson_Ho
04/24
0
0
Android知识图谱:我们到底需要学习哪些Android知识?

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”。 所以,今天,我将献上一份《Android知识图谱》,...

Carson_Ho
04/22
0
0
这是一份全面 & 详细的Android学习指南

前言 如果你也学习Android,那么你大概率会看过我的文章。 经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”、”如何实践应用Android“等。 所以,今天,我将...

Carson_Ho
05/05
0
0
Android实践手册:该如何应用Android知识到实际场景中

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”、”如何实践应用Android“等 在上两篇文章中,主要...

Carson_Ho
04/29
0
0
Android知识体系总结(全方面覆盖Android知识结构,面试&进阶)

Android知识体系总结(全方面覆盖Android知识结构,面试&进阶 Version-1.0.1 时间:2018.09) 基本内容 : Android基础知识:基本涵盖Android所有知识体系,四大组件,Fragment,WebView,事件分发...

Java高级架构
2018/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
4
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
13
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部