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

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

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

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

// 取消titleBar
requestWindowFeature(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)MainActivity
private 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转BitMap
public 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"/>
-------------------------------------------------------------------
//activity
private ToggleButton mTb;
private ImageView mIv;
@Override
protected 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

//获取VersionName
public 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;
   }
}

//获取VersionCode
public 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传值    对应的范例2
Intent intent1 = new Intent();
intent1.putExtra("name" , mName);
int resultCode = 1;
setResult(resultCode ,intent1);
------------------------------------
//SecondActivity取值  对应的范例1
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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
为了满足广大Android开发爱好者与从业者的学习需求,我们精心整理并上传了一份全面而实用的Android项目资源包。这份资源包内容丰富,涵盖了从基础知识到实战应用的全方位内容,旨在为开发者们提供一个便捷、高效的学习平台。 一、文件手册 资源包的文件手册部分,详细记录Android开发的核心知识点和常用技术。无论是初学者还是有一定经验的开发者,都能从找到所需的学习资料。手册采用了简洁明了的排版方式,使得查阅更加方便快捷。同时,手册内容深入浅出,既适合新手入门,也能为老手提供有价值的参考。 二、项目实战与练习 为了让学习者能够将理论知识与实践相结合,我们特别准备了项目实战与练习部分。这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了一系列练习题,旨在巩固所学知识,检验学习成果。这些练习题既有基础题,也有难度较高的挑战题,适合不同层次的学习者进行练习。 三、Android开发工具集 在Android开发过程,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效地进行Android开发工作。 总的来说,这份Android项目资源包是一份不可多得的学习资料,无论你是初学者还是有一定经验的开发者,都能从受益匪浅。我们希望通过这份资源包,为广大Android开发爱好者与从业者提供一个更加便捷、高效的学习平台,共同推动Android开发领域的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBackTo

感谢各位金主大大(* _ *)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值