Android开发笔记 - 示例代码

26 篇文章 1 订阅
  • 非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(
            "yyyyMMddHH: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 boxswitch)
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"
    beforeDescendantsviewgroup会优先其子类控件而获取到焦点 
    afterDescendantsviewgroup只有当其子类控件不需要获取焦点时才获取焦点 
    blocksDescendantsviewgroup会覆盖子类控件而直接获得焦点
    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 人脸识别



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值