android 编程 应用代码

 1:获取前台正在运行的程序名称,可以将下面代码放在activity生命周期的函数中执行,看看回打印什么。

获取前台的程序需要权限 ,要在AndroidManifest.xml文件中添加 

<uses-permission android:name="android.permission.GET_TASKS" />

ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasksInfo = mActivityManager.getRunningTasks(1);
if (tasksInfo.size() > 0) {
   KLog.d(TAG, "videoActivity " +tasksInfo.get(0).topActivity.getClassName() +" "+ tasksInfo.get(0).topActivity.getPackageName()); 
  }

2: 打印函数堆栈,对阅读源码非常有用。在你代码任何函数里放入以下代码,看看会打印什么。

Thread.dumpStack();

3:在 ListFragment 中的 ListView ,设置 setEmptyView 的问题。

  setEmptyView 函数的使用网上教程 通常都是在ListActivity 或 Activity 中onCreate函数中用,在ListFragment中,要获取ListView要在onActivityCreated函数或者onStart函数中调用getListView()来获取ListView,如果在 onCreate中调用getListView(),会得到错误 Caused by: java.lang.IllegalStateException: Content view not yet created。

	private TextView newEmptyView(String text) {
	    TextView emptyView = new TextView(getActivity());
	    emptyView.setText(text);
	    //将 emptyView 添加到 view 列表层。这里是容易忽略的地方
	    ((ViewGroup) getListView().getParent()).addView(emptyView);

	    return emptyView;
	}	
	@Override
	public void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		getListView().setEmptyView(newEmptyView("我是空得"));
	}

4: 创建Activity子类的时候,要先创建一个BaseActivity 继承自Activity 。然后咱要创建的Activity子类 再继承自BaseActivity,以后在这个工程里所有的Activity子类都继承自BaseActivity。目的是为了统一管理,修改一处代码,可以作用到所有的Activity,比如下面的代码,如果所有的Activity子类都继承自BaseActivity,那不管哪个Activity被创建,都会在logcat中打印出该Activity的名字,这样就知道当前界面是哪个Activity

public class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity", getClass().getSimpleName());
    }
}


5:启动Activity的最佳写法

假设在A界面点击按钮启动B,一般写法

            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(A.this, B.class);
                intent.putExtra("param1", "data1");
                intent.putExtra("param2", "data2");
                startActivity(intent);
            }

最佳写法是在B类中实现一个函数 BStart

public class B extends BaseActivity {
                public static void BStart(Context context, String data1, String data2) 
                { 
                    Intent intent = new Intent(context, B.class);
                    intent.putExtra("param1", data1);
                    intent.putExtra("param2", data2);
                    context.startActivity(intent);
                }
}
然后在A类的点击后调用该方法

            @Override
            public void onClick(View arg0) {
                B.BStart(A.this, "data1", "data2");
            }

好处就是可以是Activity启动变简单,如果别人要启动B,能很方便的知道B需要哪些参数。

6.Android中的CookieManager

在Android应用程序中加载一个WebView页,有时需要客户端向WebView传递Cookie。


需要应用程序先将Cookie注入进去,打开该网页时,WebView会将加载的url通过http请求传输到服务器。同时,在这次请求中,会将Cookie信息通过http header传递过去。


    流程如下:


    1、客户端通过以下代码设置cookie

public static void synCookies(Context context, String url) {  
   CookieSyncManager.createInstance(context);  
   CookieManager cookieManager = CookieManager.getInstance();  
   cookieManager.setCookie(url, "uid=1243432");    
   CookieSyncManager.getInstance().sync();  
}
   2、CookieManager会将这个Cookie存入该应用程序/data/data/databases/目录下的webviewCookiesChromium.db数据库的cookies表中
   3、打开网页,WebView从数据库中读取该cookie值,放到http请求的头部,传递到服务器
   4、客户端可以在注销登录时清除该应用程序用到的所有cookies

private void removeCookie(Context context) {
    CookieSyncManager.createInstance(context);  
    CookieManager cookieManager = CookieManager.getInstance(); 
    cookieManager.removeAllCookie();
    CookieSyncManager.getInstance().sync();  
}

7.判断系统中是否安装了某些app或者Activity

 1.根据包名判断应用是否存在

	public boolean checkApplication(String packageName) {
		if (packageName == null || "".equals(packageName)) {
			return false;
		}
		try {
			ApplicationInfo info = getActivity().getPackageManager().getApplicationInfo(
					packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
			return true;
		} catch (NameNotFoundException e) {
			return false;
		}
	}

  2. 判断Activity是否存在

		Intent intent = new Intent();
		intent.setClassName("包名", "类名");
		if (getActivity().getPackageManager().resolveActivity(intent, 0) == null) {
			// 说明系统中不存在这个activity
		}
		Intent intent = new Intent();
		intent.setClassName("包名", "类名");
		if (intent.resolveActivity(getActivity().getPackageManager()) == null) {
			// 说明系统中不存在这个activity
		}

8.图片压缩 比例计算

		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inSampleSize = ?

inSampleSize 值的计算方法在源码sdk 的 ThumbnailUtils 里有一个私有函数 ,注释里说是为了避免OOM异常进行的对应处理,看着貌似很高级。

    private static int computeSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) 

minSideLength :调整后图片最小的宽或高的值

maxNumOfPixels:调整后图片最大的内存值


9.获取window中的最顶层view 

FrameLayout view = (FrameLayout)getWindow().getDecorView();

10.eclipse 粘贴字符串自动添加转义符

    在偏好设置里 Preferences/Java/Editor/Typing/ "Escape text when pasting into a string literal"

11.给view设置圆角背景

    public static Drawable createShapeDrawable(int color, int radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setColor(color);
        drawable.setCornerRadius(radius);

        return drawable;
    }
    Drawable drawable = createShapeDrawable(Color.parseColor("#5a80b0"),6);
    view.setBackground(drawable);

12,values values-mhdpi values-hdpi values-xhdpi values-xxhdpi 读取顺序。

如果手机屏幕适配  values-hdpi ,某个值没有定义,在其他文件夹里定义了,那么读取顺序就是 values-hdpi -> values-xhdpi -> values-xxhdpi->values-mhdpi->values

只要读取到,就用这个文件夹下的值。layout也是一样的


13. ActionBar的溢出菜单 三个点 亮色和暗色的控制属性

<item name="android:actionOverflowButtonStyle">@android:style/Widget.Holo.Light.ActionButton.Overflow</item>

ActionBar 弹出菜单的高度控制属性

<item name="android:listPreferredItemHeightSmall">36dp</item>

弹出菜单即包含文字又包含图片需在onCreateOptionsMenu函数中调用

    /**
     * 利用反射让隐藏在Overflow中的MenuItem显示Icon图标
     * @param menu
     * onMenuOpened方法中调用
     */
    private void setOverflowIconVisible( Menu menu) {
        if (menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                }
            }
        }
    }

最后其他控制属性实在是不知道是啥,就不用style方式了,自己创建PopupWindow显示。

14.使用 Strict 模式以确保我们没有在主线程做某些不该做的事情(如耗时任务,网络访问等……)

if (BuildConfig.DEBUG) {
 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
       .detectAll()
       .penaltyLog()
       .build());
 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
       .detectAll()
       .penaltyLog()
       .penaltyDeathOnNetwork()
       .build());
}

















































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值