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();
在偏好设置里 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());
}