您的位置:首页 > 移动开发 > Android开发

android 编程 应用代码

2015-02-27 15:23 120 查看
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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: