Andorid一些知识点

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值