- 非Activity判断当前是否处于分屏模式
public int getDockSide() {
try {
return WindowManagerGlobal.getWindowManagerService().getDockedStackSide();
} catch (RemoteException e) {
Log.w(TAG, "Failed to get dock side: " + e);
}
return DOCKED_INVALID;
}
- 打开数据流量
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
tm.setDataEnabled(tm.getDefaultSim(),false);
- 判断屏幕方向
WindowManager wm = getWindowManager();
Display d = wm.getDefaultDisplay();
Log.d("ansen",(d.getWidth() >d.getHeight())+" ");
- 隐藏activity图标
在activity的intent-filte中加入,这句代码的意思是activity的入口申明为由接收隐士的Intent来启动,也就是这个Activity可以响应Uri为org.ansen.code://AuthActivity的特定Intent.(如果需要显示图标还响应上述Uri,我们可以在该Activity中再加入一个intent-filter标签,将data元素移到新建的标签中)
<data android:host="MainActivity" android:scheme="org.ansen.code" />
//通过URI来来启动:
// ... ...
Uri uri=Uri.parse("org.ansen.code.MainActivity");//此处应与上述Data中标签一致
intent.setData(uri);
startActivity(intent);
- 切换APP页面语言
微信的切换语言就是基于这种方式,切换了语言之后activity需要重启,微信的做法是重启跳转到主页面
/**
* @param 简体中文="zh",英语="en"
*/
public static void setLanguage(Context context,String language) {
if(language==null||context==null){
return ;
}
Resources resources = context.getResources();
Configuration config = new Configuration();
DisplayMetrics dm = resources.getDisplayMetrics();
if("en".equals(language)){
config.locale = Locale.ENGLISH;
}else if("zh".equals(language)){
config.locale = Locale.SIMPLIFIED_CHINESE;
}else{
config.locale = Locale.SIMPLIFIED_CHINESE;
}
resources.updateConfiguration(config, dm);
}
- 切换时区
//关闭开启自动更新时间
Global.putInt(context.getContentResolver(), Global.AUTO_TIME, 0);
Global.putInt(context.getContentResolver(), Global.AUTO_TIME, 1);
// 关闭开启自动更新时区
int global = android.provider.Settings.Global.getInt(mCtx.getContentResolver(), android.provider.Settings.Global.AUTO_TIME_ZONE, 1);
if(global!=0){
android.provider.Settings.Global.putInt(mCtx.getContentResolver(), android.provider.Settings.Global.AUTO_TIME_ZONE, 0);
}
需要system权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
// 设置时区
AlarmManager mAlarmManager = (AlarmManager)mCtx.getSystemService(Context.ALARM_SERVICE);
mAlarmManager.setTimeZone("GMT+08:00");
// mAlarmManager.setTimeZone("America/New_York");
// mAlarmManager.setTimeZone("GMT-5:00");
设置时区需要的权限:
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
<timezones>
<timezone id="America/Los_Angeles">美国太平洋时间 (洛杉矶)</timezone>
<timezone id="America/New_York">美国东部时间 (纽约)</timezone>
<timezone id="Europe/Athens">东欧标准时间 (雅典)</timezone>
<timezone id="Asia/Shanghai">中国标准时间 (北京)</timezone>
<timezone id="Asia/Hong_Kong">香港时间 (香港)</timezone>
<timezone id="Asia/Taipei">台北时间 (台北)</timezone>
<timezone id="Asia/Seoul">首尔</timezone>
<timezone id="Asia/Tokyo">日本时间 (东京)</timezone>
<timezone id="Australia/Sydney">悉尼</timezone>
</timezones>
- 获取当前系统时间日期
// ------------------SimpleDateFormat----------------------------
// 方式一
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat(
"yyyy年MM月dd日HH:mm:ss");
Date date1 = new Date(System.currentTimeMillis());
String str1 = simpleDateFormat1.format(date1);
System.out.println(str1);
// 方式二
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
String date2 = simpleDateFormat2.format(new Date());
System.out.println(date2);
// 只获取 年 月 (只获取时间或秒同理)
SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy-MM");
String str3 = simpleDateFormat3.format(new java.util.Date());
System.out.println(str3);
// 指定时区的时间
DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(
DateFormat.FULL, DateFormat.FULL, Locale.CHINA);
String str4 = dateTimeInstance.format(new Date());
System.out.println(str4);
// -----------------获取时间是24小时制还是12小时制-----------------------------
ContentResolver cv = this.getContentResolver();
String strTimeFormat = android.provider.Settings.System.getString(cv,
android.provider.Settings.System.TIME_12_24);
System.out.println(strTimeFormat);
// ---------------------calendar---------------------------
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println("year:" + year + "_month:" + month + "_day:" + day
+ "_hour:" + hour + "_minute:" + minute + "_SECOND:" + second);
// ------------------------Time--------------------------------
Time t = new Time(); // Time t=new Time("GMT+8"); 加上Time Zone资料。
t.setToNow(); // 取得系统时间。
int year1 = t.year;
int month1 = t.month;
int day1 = t.monthDay;
int hour1 = t.hour; // 0-23
int minute1 = t.minute;
int second1 = t.second;
System.out.println("year1:" + year1 + "_month1:" + month1 + "_day1:"
+ day1 + "_hour1:" + hour1 + "_minute1:" + minute1
+ "_SECOND1:" + second1);
- 切换系统语言
locale = getResources().getConfiguration().locale;
language = locale.getLanguage();
Utils.updateLanguage(Locale.CHINA);
public static void updateLanguage(Locale locale) {
try {
Object objIActMag, objActMagNative;
Class clzIActMag = Class.forName("android.app.IActivityManager");
Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
// IActivityManager iActMag = ActivityManagerNative.getDefault();
objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
// Configuration config = iActMag.getConfiguration();
Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
config.locale = locale;
// iActMag.updateConfiguration(config);
// 此处需要声明权限:android.permission.CHANGE_CONFIGURATION
// 会重新调用 onCreate();
Class[] clzParams = { Configuration.class };
Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod(
"updateConfiguration", clzParams);
mtdIActMag$updateConfiguration.invoke(objIActMag, config);
} catch (Exception e) {
e.printStackTrace();
}
}
- 重启apk
通过重启apk来改变语言
private Application mApplication;
private void reStartApk() {
if (mApplication == null) {
mApplication = LauncherApplication.getInstance();
}
int remotePid = Utils.getPid(mApplication, "com.moco.launcher:remote");
android.os.Process.killProcess(remotePid);
PackageManager packageManager = mApplication.getPackageManager();
Intent launchIntentForPackage = packageManager
.getLaunchIntentForPackage(mApplication.getPackageName());
mApplication.startActivity(launchIntentForPackage);
android.os.Process.killProcess(android.os.Process.myPid());
}
public static int getPid(Context ctx,String progressName)
{
ActivityManager mActivityManager = (ActivityManager)
ctx
.getSystemService(ctx.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo>
mRunningProcess = mActivityManager
.getRunningAppProcesses();
int i = -1;
for (ActivityManager.RunningAppProcessInfo amProcess :
mRunningProcess)
{
if(amProcess.processName.equals(progressName))
{
return amProcess.pid;
}
}
return i;
}
Theme
- Actionbar左侧预留一点空白
<style name="ClubToolbar" parent="Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item><!-- 设置该属性解决空白部分-->
</style>
@android:style/Theme.Material.Light.LightStatusBar
<item name="android:colorPrimaryDark">@color/material_blue_700</item>
colorPrimaryDark
状态栏背景色
colorPrimary
actionbar背景色
colorAccent
控件颜色选中的(如:check box、switch)
textColorPrimary
App bar 上的标题与更多菜单中的文字颜色
colorControlNormal
各控制元件的预设颜色。
background
App的背景色
navigationBarColor
导航栏的背景色
- 主题
<item name="android:windowBackground">@android:color/transparent</item> // 设置窗体背景色
<item name="android:windowIsTranslucent">true</item> // 设置窗体背景透明
// 1.可能导致Activity页面显示不出来
// 2.android动画不生效(windowAnimationStyle);设置parent="@android:style/Animation.Translucent"解决
// 或使用overridePendingTransition来显示动画
<item name="android:windowDisablePreview">true</item> // 取消窗体背景和actionbar背景色预览
布局XML
android:descendantFocusability="beforeDescendants"
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
android:textAllCaps="false" //Button属性取消默认字母大写
TextView:
android:ellipsize="start" 省略号在开头
android:ellipsize="middle" 省略号在中间
android:ellipsize="end" 省略号在结尾
android:ellipsize="marquee" 跑马灯显示
注: EditText不支持marquee这种模式
<Space
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1" />
水平方向的LinearLayout设置space来填充空隙
- 使用 LinearLayoutCompat 实现线性布局元素之间的分割线
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:divider="@drawable/draw_outline_paint"
app:dividerPadding="10dp"
app:showDividers="middle|beginning|end">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="tomorrow_p"
android:textSize="20sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="tomorrow_p"
android:textSize="20sp" />
</android.support.v7.widget.LinearLayoutCompat>
1.app:divider=”@drawable/draw_outline_paint”
设置分隔线样式
2.app:dividerPadding=”10dp”
设置分隔线左右边距
3.app:showDividers=”middle|beginning|end” 设置分隔线显示的位置:
middle 每个item中间
beginning 每个item顶部现实
end 每个item底部现实
none不显示分隔线
Preference
- 自定义preference:
Preference pref = new Preference(getActivity());
pref.setLayoutResource(R.layout.horizontal_preference);
pref.setTitle(title);
pref.setSummary(summary);
pref.setSelectable(false);
parent.addPreference(pref);
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="1dp"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<TextView
android:id="@android:id/title"
android:textAppearance="?android:attr/textAppearanceListItem"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@android:id/summary"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="1"
android:gravity="end|bottom" />
</LinearLayout>
- ListPreference
//android:summary="@string/screen_timeout_summary"
<string name="screen_timeout_summary" msgid="327761329263064327">"无操作<xliff:g id="TIMEOUT_DESCRIPTION">%1$s</xliff:g>后"</string>
- 系统无响应卡死Log
12-22 14:31:20.172 1945-3089/system_process I/InputDispatcher: Dropped event because it is stale.
12-22 14:32:21.657 1945-3089/system_process W/InputDispatcher: channel '35c1af9 ScreenshotAnimation (server)' ~ Consumer closed input channel or an error occurred. events=0xd
12-22 14:32:21.657 1945-3089/system_process E/InputDispatcher: channel '35c1af9 ScreenshotAnimation (server)' ~ Channel is unrecoverably broken and will be disposed!
12-22 14:32:21.699 1945-3944/system_process W/InputDispatcher: Attempted to unregister already unregistered input channel '35c1af9 ScreenshotAnimation (server)'
BroadcastReceiver
- DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED 检测DropBox产生新的记录
/data/system/dropbox
Tools
- gerrit代码review
- jenkins代码编译
- GsonFormat快速实现JavaBean
- Android ButterKnife Zelezny配合ButterKnife实现注解,从此不用写findViewById
SDK
- 1、SDK不宜过大
- 2、SDK具备完善的样例工程、API说明文档、集成手册以及发布包
- 3、所有jar、res资源等加入SDK特有的前缀标识,防止与其他类库冲突
- 4、明确给出SDK集成的混淆配置
- 5、SDK以邮件形式送付给相关人员,并附带README、版本号、变更日志、MD5指纹
- 6、第三方库的问题,内置要么改包名、要么尽可能使用低版本兼容性比较广泛的版本或者自己SDK内部实现
openCV 人脸识别