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。