Andorid一些知识点

来源:互联网 发布:免费数据报告网站 编辑:程序博客网 时间:2024/05/16 15:37

1.在任何地方获得APP的context

新建MyApplication.java

package com.example.util;import android.app.Application;import android.content.Context;public class MyApplication extends Application{   private  static  Context context;    @Override    public void onCreate() {        context = getApplicationContext();    }    public static Context getContext(){        return context;    }}

在AndroidManifest.xml指定初始化MyApplication

  <application        android:name="com.example.util.MyApplication"        ...        >        </application>

用法:在任何一个地方

Toast.makeText(MyApplication.getContext(),”高端技巧获得Context”,Toast.LENGTH_LONG).show();

2.使用Intent传递对象
Serializable(序列化)和Parcelable

Parcelable的效率比Serializable要一些

Serializable:

只要让实体类实现Serializable借口。
如:

package com.example.entity;import java.io.Serializable;/* * 实体类给ListView提供数据  */public class Fruit implements Serializable{    int imageId;    String name;    public int getImageId() {        return imageId;    }    public void setImageId(int imageId) {        this.imageId = imageId;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

A.java

...intent.putExtra("fruit_data",fruit);...

B.java

...Fruit fruit = (Fruit)getIntent().getSerializableExtra("fruit_data");...

Parcelable :

package com.example.learing;import android.os.Parcel;import android.os.Parcelable;public class Model implements Parcelable{    private int id;    private String name;    public Model(int id, String name) {        this.id = id;        this.name = name;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public int describeContents() {        return 0;    }    // 序列化    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(id);        dest.writeString(name);    }    // 反序列化    public static final Parcelable.Creator<Model> CREATOR = new Creator<Model>() {        @Override        public Model[] newArray(int size) {            return new Model[size];        }        @Override        public Model createFromParcel(Parcel source) {            return new Model(source);        }    };    private Model(Parcel in) {        id = in.readInt();        name = in.readString();    }}

3.定制自己的日记工具
//详情《第一行代码》-464页

。。。

3.在代码添加View

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ViewGroup layout = (ViewGroup) this.findViewById(R.id.frame_layout);//获得layout        TextView tv = new TextView(this);//创建一个TextView        tv.setGravity(Gravity.CENTER);//设置TextView的布局(居中)        tv.setText("123");//设置TextView的内容        layout.addView(tv);//把view添加到layout中    }}

4.使用onSaveInstanceState()保存瞬时数据

public class MainActivity extends Activity {    EditText ed;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ed = (EditText) this.findViewById(R.id.ed);        ed.setText("2");//起作用        //一次进来不会执行(旋转屏幕后才会执行),只有旋转屏幕后savedInstanceState就不会为null        if(savedInstanceState != null){            ed.setText(savedInstanceState.getString("ed"));            Log.v("TAG","savedInstanceState");            Log.v("tag", ed.getText().toString());            //输出的值是“text”,但是界面不发生改变        }    }    @Override    protected void onStart() {        super.onStart();        Log.v("onStart()", ed.getText().toString());    }    @Override    protected void onResume() {        super.onResume();        Log.v("onResume()", ed.getText().toString());    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        //保存数据        outState.putString("ed", "text");    }}

效果:
这里写图片描述

结果说明:当屏幕旋转后,屏幕显示的依然是“2”,而不是“text”。
原因是因为在onCreate()方法里ed的值确实变为了“text”。但由于android可以自动的保存瞬时数据,当屏幕发生旋转时ed的值为“2”,这时候系统已经保存“2”这个值,当执行onResume()方法时,ed的值被赋值为“2”。所以ed值得变化为 2→text→2

5.Android程序(eclipse上的程序代码)不能直接在移动设备(如小米平板)上运行的解决方法

下载豌豆荚,进行usb连接,之后会自动安装驱动并进行秘钥验证,选择允许后程序即可用在移动设备上运行。

6.判断设备能不能打电话

TelephonyManager t = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);int type = t.getPhoneType();//type = 0 :不能通话

这里写图片描述


之前这篇文章消失了,不知道怎么得又回来了~~~可喜可贺可喜可贺

7.计算地球是2个点的经纬度,计算它们之间的距离(米)

private static  double EARTH_RADIUS = 6378137.0;//地球半径 //判断经纬度        private static double rad(double d)        {            return d * Math.PI / 180.0;        }        /// <summary>        /// 获取距离        /// </summary>        /// <param name="lat1"></param>        /// <param name="lng1"></param>        /// <param name="lat2"></param>        /// <param name="lng2"></param>        /// <returns>返回米</returns>        public static double GetDistance(double lat1, double lng1, double lat2, double lng2)        {            double radLat1 = rad(lat1);            double radLat2 = rad(lat2);            double a = radLat1 - radLat2;            double b = rad(lng1) - rad(lng2);            double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +             Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));            s = s * EARTH_RADIUS;            s = Math.round(s * 10000) / 10000;            return s;        }

8.使用腾讯地图时出现 couldn’t find “libtencentloc.so”
原因是在项目的libs目录下有,armebai,armebai-v7,armbeai-v8等文件,这些文件是与cpu适配相关的。armebai是调试版本(兼容版本),armebai-v7是发行版本。部分手机出现这个问题是原因在armebai-v7目录下没有这个”libtencentloc.so”文件。

解决的方案:
1.删除其他的armebai文件,如armebai-v7,留下一个armebai(兼容)—— ps.这个我试过,确实是可以的,只是性能会差一点
2.往armebai-v7等文件上加上对应的”libtencentloc.so”文件,这些文件在DEMO里可以找到—— ps.这个没有试过

介绍armebai的网址:http://gybin.iteye.com/blog/2031565


9.拖动View ,并让其自动回到原点(初始位置)
(1)拖动View,实际上是调用View的layout()方法来重新设置View的位置。
(2)回到原点的动画效果,在自定义View添加Scroller变量,在构造函数初始化并重写computeScroll()方法.

自定义View
DrawView.java

package com.example.day0115;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.Scroller;public class DrawView extends View{    public Scroller mScroller;    public DrawView(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub        mScroller = new Scroller(context);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);    }    //draw()执行时会调用    @Override    public void computeScroll() {        super.computeScroll();        //判断scroller是否执行完毕        if (mScroller.computeScrollOffset()) {            ((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());            //通过重绘来不断调用computeScroll()            invalidate();        }    }}

MainActivity.java

private int lastX;private int lastY;...@Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            lastX = (int) event.getX();            lastY = (int) event.getY();            break;        case MotionEvent.ACTION_MOVE :            int offsetX = (int) (event.getX()) - lastX;//x偏差值            int offsetY = (int) (event.getY()) - lastY;//y偏差值            drawView.layout(drawView.getLeft()+offsetX, drawView.getTop()+offsetY, drawView.getRight()+offsetX, drawView.getBottom()+offsetY);            //另一种方法:            //((View) textview.getParent()).scrollBy(-offsetX, -offsetY);//为什么是负的?因为这里是画板在移动.            //这里移动的是内容,要移动View就要让它的parent执行这个方法            lastX = (int) event.getX();            lastY = (int) event.getY();            break;        //实现方块自动回到原点(动画)    case MotionEvent.ACTION_UP :            int x = ((View)drawView.getParent()).getScrollX();            int y = ((View)drawView.getParent()).getScrollY();            drawView.mScroller.startScroll(x, y, -x, -y,2000);//2000即为动画时间2秒,另外一个重载的方法没有这个参数即动画时间默认短            drawView.invalidate();//重绘,开始动画            break;        }        return super.onTouchEvent(event);    }    ...

效果

这里写图片描述


10.在app里打开另一个app

以微信为例子,实际上是要知道另一个app的包名,如果手机上有微信则打开,没有则下载!

try {      PackageManager packageManager = getPackageManager();       Intent intent=new Intent();       intent = packageManager.getLaunchIntentForPackage("com.tencent.mm");      startActivity(intent);  } catch (Exception e) {      e.printStackTrace();      Intent viewIntent = new      Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/"));      startActivity(viewIntent);  }  

转载于:http://blog.csdn.net/lovexieyuan520/article/details/44301753


11.Layout_weight的使用技巧

0.只有一个控件,但该控件显示占父控件的一半。在LinearLayout里添加android:weightSum=”2”

1.LinearLayout的layout_weight属性,首先按控件声明的尺寸(如dp,warp_content)进行分配,然后将剩下的尺寸按weight进行分配

2.如果layout_width=”match_parent”,又有layout_weight属性,
这样的话控制的比例会是反过来。比如weight是1 :2 :2,实际上控件显示的是2 : 1 :1.因为控件实际宽度=声明宽度+父控件剩余宽度*比例,如果控件声明的宽度是match_parent,那么父控件剩余宽度是负的(剩余宽度=480 - 480*3)。

3.对于weight(比例较小),text内容又超过2行的并且是garvity=center的控件。

<LinearLayout     android:layout_width="match_parent"    android:layout_height="match_parent"     xmlns:android="http://schemas.android.com/apk/res/android"     >    <TextView        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="48dp"        android:text="@string/hello_world"        android:gravity="center"        android:background="#333" />    <TextView        android:layout_weight="2"        android:layout_width="0dp"         android:gravity="center"        android:layout_height="48dp"        android:text="@string/hello_world"        android:background="#FFFF00" />    <TextView        android:layout_weight="3"        android:layout_width="0dp"        android:layout_height="48dp"         android:gravity="center"        android:text="@string/hello_world"        android:background="#FFC1C1" /></LinearLayout>

效果

这里写图片描述

解决方案:
实际上会变成文字对齐,只有在控件的parent加上android:baselineAligned=”false”,这里既是LinearLayout才能解决这个对齐问题

12关于获得的View的长宽

TextView tv = (TextView) findViewById(R.id.tv);//      int height = tv.getMeasuredHeight();---> 0 //      int height = tv.getHeight();---> 0        int height = tv.getLayoutParams().height; //----> 40 

1.只有最后一种方式才能获取到height,其他2种方式获得的都是0.
2.padding不算在height里面


13.关于HashMap

HashMap<String, String> map = new HashMap<String,String>();        map.put("s", "s");        HashMap<String, String> v = map;        v.put("s", "v");        Log.v("TAG", map.get("s"));

map里面的key为“s”的值已经被修改变为“v”。

而int 或者 String

        String a = 0 +"";        String b = a;        b = 3+"";        Log.v("TAG", a+"");

a的值依然为 “0”


14.简单动画(自定义View)

这里写图片描述
使用AnimationDrawable对象

public class AnimationView extends ImageView{    public AnimationView(Context context) {        this(context, null);    }    public AnimationView(Context context, AttributeSet attrs) {        super(context, attrs);        initAnimation(context);    }    private void initAnimation(Context context) {        /*定义AnimationDrawable动画*/        final AnimationDrawable ad = new AnimationDrawable();        for (int i = 0; i < 5; i++) {            //  图片id  这里的图片是项目内的名称            int id = getResources().getIdentifier("login_animation"+i, "drawable", context.getPackageName());            //  根据图片id获得drawable对象            Drawable d = getResources().getDrawable(id);            //  为动画添加drawable对象并设置切换间隔时间            ad.addFrame(d, 200);        }        //  设置动画循环        ad.setOneShot(false);        //  为View设置背景        this.setBackgroundDrawable(ad);        Runnable callback = new Runnable() {            @Override            public void run() {                //  动画开始                ad.start();            }        };        //  使用消息通知框架来开始播放动画,设置回调和延迟时间        new Handler( ).postDelayed(callback, 100);    }}

15.activity和application的context有何区别?

Application Context只针对整个应用,而Activity 中的Context针对不同的Activity,也就是说,Application Context是户口本影响全局,Activity 中的Context是户口本中每个人的身份证影响单个人。


16.therad和service有何区别?

Service和Thread根本就不是一个级别的东西,Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类,由当前程序托管,而service托管于系统的servicemanager。这样做的目的是因为Thread独立于activity,一旦activity结束,该线程也不一定会执行完成,而此时你不再持有该thread的引用,你无法在控制他了。而且我们有的时候也需要多个不同的activity控制一个服务。这些thread都不能实现,所以我们引进service。

0 0
原创粉丝点击