在Activity可见时进行页面刷新,即处于Activity栈顶,当然,这种刷新操作 可以在onStart,onResume,onRestart,onNewIntent+singleTask中,但最好的位置是onResume,其他方式可能会造成窗体泄露
Service的两种启动方式,startService和bindService,根据启动方式的不同,当然也有一种称为复合方式startService+bindService,Service销毁的方式不同,startService可以做app退出后的后台服务,但bindService不行,startService+bindService也可以做后app退出后的后台服务,但app退出时必须unbind,反过来bindService+startService不能做app退出后的服务
建议在Activity增加一个变量activityIsActivity来判断当前Activity是否处于活动状态,Activity::onResume和Activity:onPause中改变其值,防止在无界面时发生窗体泄露问题。
在Activity的onWindowFocusChanged的方法中监听焦点的改变
使用InputMethodManager 退出键盘最灵活的方式是
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开 if(isOpen) { imm.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); //(WidgetSearchActivity是当前的Activity) }
当然,如果页面只会有一个可以启动键盘的EditText,可直接将MainActivity.this.getCurrentFocus()替换成该空间
dip转px的公式是 px = dip*scale+0.5f,scale是密度,当然,还可以使用 (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, context.getResources().getDisplayMetrics());
获取DisplayMetrics的方式有2种,getWindow.getWindowManager.getDisplayMetrics(DisplayMetric dm),还有一种是context.getResources().getDisplayMetrics(),后者使用比较灵活,建议使用后者
自定义权限+引用+使用自定义权限的方式是,自定义<permission android:name="自定义权限" android:protected="根据安全等级设置,如果保密性较高,使用签名方式" />,然后引用<use-permission android:name="自定义权限" />,使用自定义权限 如下
<receiver android:name=".SmsBroadCastReceiver" android:export="false" android:permission="自定义权限"> <intent-filter android:priority="20"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
android:export表示该组件是否被跨进程调用,默认是false,android:windowSoftInputMode表示设置 键盘弹出UI布局的改变 以及定义键盘弹出状态,何时弹出等行为
android:noHistory表示该组件不会在(最近打开列表中)显示,android:configChanges表示当发生指定的改变时,Activity程序不会重新启动,响应的变化也会通过onConfigurationChanged中得到,android:screenOriention表示Activity应该处于何种屏幕状态,android:lancheMode是指定创建模式
强制检测跨进程调用的权限问题
public boolean isEnable(){ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK,"you donot have the wake_lock permission"); Log.d("pid="+Binder.getCallingPid()+",uid="+Binder.getCallingUid()); return isEnableInternal(); }
<use-library>生命需要的连接共享库,<use-feature>生命app所需要的硬件环境支持,如支持蓝牙等,否则app将安装失败。
android:clearTaskOnLaunch和android:finishOnTaskLauch的区别是,前者清楚自身以外的Activity,后者清除转入后台的Activity Task。后者比较常用。
系统会为每一个app分配一个虚拟机进程,因此不想jvm所有的应用共享同一个虚拟机进程
使用LocalBroadcastReceiver或者myView.getHandler进行消息队列方式的更新,自定义Handler时请以静态方式继承Handler,否则可能因为Handler持有的Activity无法销毁,因为Handler本身是持有静态对象,他的生命周期和app相同,因此为了让Activity及时销毁,必须静态继承 public static class MyHandler extends Handler
16.android:process="string",如过值为 :string 则必要时自动创建新进程,如果是 普通string 则会必要时加入全局的进程,因此建议使用前者
<service android:name="com.example.actiontabbar.RemoteService" android:exported="true" android:enabled="true" android:process=":remote" ></service>
效果如下
17.关于可滑动的ViewGroup滑到边界时出现阴影的消除方法
android:overScrollMode="never"
18.Fragment中的onCreateView用于加载layout.,而onViewCreate用于初始化被onCreateView加载的layout
19.Manifest中一些属性的说明,相关补充参考 android Manifest.xml选项
android:excludeFromRecents="true"--->表示不在最近打开的列表中显示 android:singleUser="true"--->表示单用户,所有用户使用的Activity是同一个,和singletop,singletask的区别是,无论如何启动,他总是一个。 android:multiprocess=["true" | "false"] ---->指定是否允许多个app实例运行在不同进程上 android:permission="" ---->外部其他程序调用该组件要使用的权限 android:noHistory=["true" | "false"] 是否需要移除这个activity当用户切换到其他屏幕时 android:exported=["true" | "false"]是否允许activity被其它程序调用 android:showOnLockScreen="" 是否显示在锁屏界面上面(qq有这功能,锁屏之后也能看见信息) android:hardwareAccelerated=["true" | "false"] 是否硬件加速,此标志只是说明app可能需要该权限,但实际上开发中需要手动设置。 android:largeHeap=["true" | "false"] 是否允许最大堆 android:finishOnTaskLaunch=["true" | "false"]是否关闭已打开的activity当用户重新启动这个任务的时候
20.getWindow().getAttributes()返回的是Window.LayoutParams,可设置窗体效果
private void setTranslucentStatus(boolean on) { Window win = getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; if (on) { winParams.flags |= bits; } else { winParams.flags &= ~bits; } win.setAttributes(winParams); }
21.View方法addOnLayoutChangeListener(listener)可用来监听View是否已经绘制完毕
22.关于内存优化add/remove,register/unregister,bind/unbind等方法必须等次出现,以防止内存泄露
23.BroadcastReceiver不能启动线程的原因是其生命周期相对短暂,而且不能执行耗时操作。
24.在Application中监听ActivityLifecycleCallbacks ,监听Activity的生命周期
public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); }
25.使用android.os.Debug.dumpHprofData(path)生成app堆栈信息文件,检测OOM问题
26.FileObserver文件观察者,用于观察目录和文件的变化