编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/60642640
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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----------