Android开发中的一些小知识点记录(1-20)

来源:互联网 发布:九宫格日记软件 编辑:程序博客网 时间:2024/05/17 07:20

编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/60642640

Android开发中的一些小知识点记录(21-40) (41-60)

1,取消顶部的titlebar并全屏显示

// 取消titleBarrequestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 取消actionbar将android:theme对应的主题parent设置为NoActionBar

2,根据手机和平板(TV)的不同,进行横竖屏的不同显示

if(!PhoneUtils.isTv(this)){    //是手机就横屏 是平板(TV)就正常    if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    }}public class PhoneUtils {    public static boolean isTv(Context context) {            return (context.getResources().getConfiguration().screenLayout                    & Configuration.SCREENLAYOUT_SIZE_MASK)                    >= Configuration.SCREENLAYOUT_SIZE_LARGE;    }}

3,解决一进入Activity EdirText抢占焦点,自动弹出虚拟键盘问题

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

4,注册广播,实现应用开机自启动

  定义一个BroadcastReceiver

//创建开机自启动的广播接收者public class BootupReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        //最好睡眠几秒钟,保证程序启动流畅        SystemClock.sleep(2000);        intent = new Intent(context, SplashActivity.class);        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(intent);    }}

  在AndroidManifest文件中定义该BroadcastReceiver

<receiver    android:name=".receiver.BootupReceiver"        android:enabled="true"    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED"/>        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></receiver>

  在AndroidManifest文件中添加权限

<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />

5, 应用开机自启时,保证屏幕为去锁状态

  在Activity的onCreate()方法中添加如下代码

KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);KeyguardManager.KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);lock.disableKeyguard();

  在AndroidManifest文件中添加权限

<uses-permission android:name=”android.permission.DISABLE_KEYGUARD” />

6,点击退出按钮,需输入正确密码退出

/**点击退出按钮*/public void logout(View view){    final EditText password = new EditText(this);    password.setFocusable(true);    //设置为密码不可见形式    password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);    AlertDialog.Builder builder = new AlertDialog.Builder(this);    builder.setTitle("请输入退出密码")            .setIcon(R.mipmap.logo)            .setNegativeButton("取消", null)            .setCancelable(false)            .setView(password)            .setPositiveButton("确定",                    new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialog, int which) {                            String inputName = password.getText().toString();                            if(inputName.equals("123456")){                                //退出所有Activity操作                                ExitApplication.getInstance().exit();                            }else{                                new AlertDialog.Builder(SecondActivity.this)                                        .setTitle("警告")                                        .setIcon(R.mipmap.logo)                                        .setMessage("密码输入错误,请重新输入!")                                        .setCancelable(false)                                        .setNegativeButton("取消",null)                                        .setPositiveButton("确定",null)                                        .show();                            }                        }                    }).show();}

  ExitApplication.getInstance().exit(); 不理解的话可参考:Android中实现一键退出应用程序 http://blog.csdn.net/zxc514257857/article/details/62104900

7,彩色ProgressBar

//(activity)MainActivityprivate ProgressBar mProgressBar;public static final int LOADING = 1;private Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        switch (msg.what){            case LOADING:            //各种初始化操作            break;        }    }}mProgressBar = (ProgressBar) findViewById(R.id.progressBar);new Thread(new Runnable() {            int progress = 0;            @Override            public void run() {                for (int i = 0; i < 100; i++) {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    mProgressBar.setProgress(++progress);                    mProgressBar.incrementProgressBy(i);                }                handler.sendEmptyMessage(LOADING);            }        }).start();-----------------------------------------------------------//(layout)activity_main<ProgressBar        android:id="@+id/progressBar"        style="?android:attr/progressBarStyleHorizontal"        android:background="#fff"        android:layout_width="match_parent"        android:layout_height="8dp"        android:progressDrawable="@drawable/progressbar"        android:layout_marginBottom="20dp"        android:layout_alignParentBottom="true"/>-----------------------------------------------------------//(drawable)progressbar.xml<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:id="@android:id/background">        <shape>            <corners android:radius="5dip" />            <gradient                android:angle="0"                android:centerColor="#fff"                android:centerY="0.75"                android:endColor="#fff"                android:startColor="#fff" />        </shape>    </item>    <item android:id="@android:id/secondaryProgress">        <clip>            <shape>                <corners android:radius="5dip" />                <gradient                    android:angle="0"                    android:centerColor="#80ffb600"                    android:centerY="0.75"                    android:endColor="#a0ffcb00"                    android:startColor="#80ffd300" />            </shape>        </clip>    </item>    <item android:id="@android:id/progress">        <clip>            <shape>                <corners android:radius="5dip" />                <gradient                    android:angle="0"                    android:endColor="#8000ff00"                    android:startColor="#80ff0000" />            </shape>        </clip>    </item></layer-list>

8,加载WebView时html的路径表示

//加载WebView时,把html文件放在和res平级的assets目录下//载入assets目录OA文件夹下的index.html页面的固定表示如下:mWebView.loadUrl("file:///android_asset/OA/index.html");

9,简单掩盖应用程序刚启动时的白屏或黑屏问题

  在AndroidManifest.xml文件中对出现白屏的那个页面(一般是第一个页面)添加一个透明的主题
如下图:
这里写图片描述

  透明主题的代码如下:

<style name="AppTransparentTheme" parent="Theme.AppCompat.Light.NoActionBar">    <item name="android:windowIsTranslucent">true</item>    <item name="android:windowBackground">@android:color/transparent</item></style>

  注:如果你发现MainActivity页面的背景也为透明的了,你需要将MainActivity的页面背景颜色手动设置为白色.

10,BitMap和String之间的相互转化

//通过Base64 BitMap转String public static String convertIconToString(Bitmap bitmap){      // outputstream      ByteArrayOutputStream baos = new ByteArrayOutputStream();    bitmap.compress(CompressFormat.PNG, 100, baos);     // 转为byte数组     byte[] appicon = baos.toByteArray();      return Base64.encodeToString(appicon, Base64.DEFAULT);  }  //通过Base64 String转BitMappublic static Bitmap convertStringToIcon(String str){     Bitmap bitmap = null;     try {         byte[] bitmapArray;         bitmapArray = Base64.decode(str, Base64.DEFAULT);         bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);         return bitmap;     }catch (Exception e){         return null;     }  }  

11,修改EditText的hint文字的大小

SpannableString ss1 = new SpannableString("编号1");// 新建一个属性对象,设置文字的大小AbsoluteSizeSpan ass = new AbsoluteSizeSpan(25, true);// 附加属性到文本ss1.setSpan(ass, 0, ss1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置hint,一定要进行转换,否则属性会消失mEt_Num1.setHint(new SpannedString(ss1));SpannableString ss2 = new SpannableString("编号2");ss2.setSpan(ass, 0, ss2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mEt_Num2.setHint(new SpannedString(ss2));

  这样就将两个EditText的hint值都设置了25dp大小。

12,开关按钮toggleButton的使用

//xml文件<ToggleButton    android:id="@+id/tb"    android:textOn="开"    android:textOff="关"    android:layout_width="match_parent"    android:layout_height="wrap_content"/><ImageView    android:id="@+id/iv"    android:background="#fff"    android:layout_width="match_parent"    android:layout_height="match_parent"/>-------------------------------------------------------------------//activityprivate ToggleButton mTb;private ImageView mIv;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mTb = (ToggleButton) findViewById(R.id.tb);    mIv = (ImageView) findViewById(R.id.iv);    mTb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {        @Override        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {            if(b){                mIv.setBackgroundColor(Color.BLACK);            }else{                mIv.setBackgroundColor(Color.WHITE);            }        }    });}

13,VersionCode和VersionName

  在ecplise中的VersionCode和VersionName在AndroidManifest.xml文件中定义着,但在Android中定义在Module的build.gradle文件中
  VersionCode:对消费者不可见,用于应用市场、程序内部识别版本,判断新旧等用途。
  VersionName:展示给消费者,消费者会通过它认知自己安装的版本,一般我们说的版本号就是这个
  VersionCode和VersionName都是从小到大不停更新,一般都是同时递增的。如:VersionCode的值可以从1一直到1000或10000,VersionName的值也是从1.0.1到1.5.3或5.3.5

//获取VersionNamepublic static String getPackageVersionName(Context context, String pkgName) {   try {      PackageManager manager = context.getPackageManager();      PackageInfo info = manager.getPackageInfo(pkgName, 0); //PackageManager.GET_CONFIGURATIONS      return info.versionName;   } catch (Exception e) {      e.printStackTrace();      return null;   }}//获取VersionCodepublic static int getPackageVersionCode(Context context, String pkgName) {   try {      PackageManager manager = context.getPackageManager();      PackageInfo info = manager.getPackageInfo(pkgName, 0);      return info.versionCode;   } catch (Exception e) {      e.printStackTrace();      return -1;   }}

14,添加菜单按钮

 //显示menu菜单  需在res目录下新建menu文件夹,menu文件夹下放置main.xml文件 public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.main , menu);     return true; }//编辑menu菜单<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item         android:id="@+id/xxx"         android:showAsAction="never"         android:title="xxx"/></menu>// 将菜单中的每一个选项和其点击事件相对应public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()){        case R.id.xxx:            break;        case R.id.xxx:            break;        default:            break;    }}

15,使用Weight属性,将Button按钮挤到最底部

//1,大布局必须为LinearLayout //2,Button按钮的高度必须为确定值 //3,Button按钮上方的布局的高度必须设置为wrap_content,并且设置layout_weight=”1”//大布局必须为LinearLayout<LinearLayout>    <LinearLayout        android:layout_height="wrap_content"       android:layout_weight="1">      //上半部分设置高度自适应,并且权重为1    </LinearyLayout>    //Button按钮的高度必须为确定值    <LinearLayout         android:layout_height="50dp">        <button andtoid:text="底部按钮"/>         </LinearyLayout></LinearLayout>

16,Intent传值基本使用

//1,使用startActivity方式传值,直接传值不求回报//MainActivity传值Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("id" ,mId);startActivity(intent);finish();//SecondActivity取值Intent intent = getIntent();String mId = intent.getStringExtra("id");//2,使用startActivityForResult方式传值,需要对方传值过来//MainActivity要值Intent intent = new Intent(MainActivity.this,SecondActivity.class);int requestCode = 0;startActivityForResult(intent,requestCode);finish();//SecondActivity传值Intent intent = new Intent();intent.putExtra("id" , mId);int resultCode = 1;setResult(resultCode ,intent);//在MainActivity的onActivityResult方法里面取值String mId = data.getStringExtra("id");//3,如果两种方式在代码中都存在,可以写在一起,不用分开来写//MainActivity要值/传值Intent intent = new Intent(MainActivity.this,SecondActivity.class);int requestCode = 0;intent.putExtra("id" ,mId);startActivityForResult(intent,requestCode);finish();//SecondActivity传值/取值Intent intent1 = new Intent();intent1.putExtra("name" , mName);int resultCode = 1;setResult(resultCode ,intent1);------------------------------------Intent intent2 = getIntent();String mId = intent2.getStringExtra("id");//在MainActivity的onActivityResult方法里面取值String mName = data.getStringExtra("name");

17,SharedPreferences基本使用

//1,创建对象并初始化控件private SharedPreferences mSp;mSp = this.getSharedPreferences("config", 0);//2,在需要程序关闭后数据显现的位置保存数据private SharedPreferences.Editor mEditor;mEditor = mSp.edit();mEditor.putBoolean("needRegister", true);mEditor.putBoolean("withoutRegister", false);mEditor.commit();//3,一般在程序开始处就显示数据private boolean mNeedRegister;private boolean mWithoutRegister;mNeedRegister = mSp.getBoolean("needRegister",true);mWithoutRegister = mSp.getBoolean("withoutRegister",false);

18,循环执行操的代码编写

//1,创建Handler对象private Handler handler = new Handler();//2,在OnCreate()方法里面调用handler.post(runnable)protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    initData();    handler.post(runnable);}//3,创建Runnable对象,并每隔1秒钟循环执行xxx()方法private Runnable runnable  = new Runnable() {        public void run() {            xxx();            handler.postDelayed(runnable,1000);        }};//4,在onPause()方法里面移除循环protected void onPause() {        super.onPause();        handler.removeCallbacks(runnable);}//注:此处的xxx()方法就是会循环执行的方法,每隔几秒循环一次可自行设定

19,使用SharedPreferences实现图片本地缓存

//1,从网络获取图片private static final int SUCCESS = 1;private void getImageFromNet(final String imagePath) {    new Thread() {        public void run() {            try {                URL url = new URL(imagePath);                HttpURLConnection con = (HttpURLConnection) url.openConnection();                con.setRequestMethod("GET");                con.setConnectTimeout(5 * 1000);                InputStream is = con.getInputStream();                //把流转换为bitmap                Bitmap bitmap = BitmapFactory.decodeStream(is);                Message message = new Message();                message.what = SUCCESS;                message.obj = bitmap;                handler.sendMessage(message);            } catch (Exception e) {                e.printStackTrace();            }        }    }.start();}//2,把Bitmap转为String存储在SharedPreferences中private SharedPreferences.Editor mEditor = mSp.edit();Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {        switch (msg.what) {            case SUCCESS:                Bitmap bitmap = (Bitmap) msg.obj;                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();                bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);                String img = new String(Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));                mEditor.putString("img", img);                mEditor.commit();        }    }};//3,需要使用时再把图片从SharedPreferences中取出private ImageView mIv_Photo = (ImageView) findViewById(R.id.iv_Photo);Bitmap img_bitmap = null;if (img != "") {    byte[] bytes = Base64.decode(img.getBytes(), 1);    img_bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);}mIv_Photo.setImageBitmap(img_bitmap);

20,Android应用市场上传、认领、通过审核的注意事项

  Android应用市场:豌豆荚、GooglePlay、小米应用商店、腾讯应用宝、搜狗市场、安智市场等
上传:准备图标、apk、文字介绍、关键词、截图等
  认领:准备代码截图、公司营业执照(个人是身份证)、apk包等
  建议:上传apk的时候,手机里一定要集齐360卫士、金山毒霸、百度安全管家、腾讯安全管家。如果这四个都查不到有风险的话,基本每个市场都可以通过了;应用商店的关键词很重要,尽量在应用描述的前一段塞进你认为目标用户会搜索的词;有熟人会审核快很多,多和负责的客服MM和商务人员打交道;签名文件一定要保存好,软件升级的时候会用到,否则无法升级。
  内容参考自:https://www.zhihu.com/question/21281842

Android开发中的一些小知识点记录(21-40) (41-60)


———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-

0 0
原创粉丝点击