android常用的代码

 

1.完成一个颜色渐变的函数,就是splash的渐变函数
AlphaAnimation aa = new AlphaAnimation(0.2f, 1.0f);
aa.setDuration(2000);
findViewById(R.id.rl_splash).startAnimation(aa);
2.获取当前的版本号。
packInfo = pm.getPackageInfo(getPackageName(), 0);
String version = packInfo.versionName;

3.安装一个新的apk,也就是检测的新的版本的apk
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
4.显示一个对话框
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("升级提醒");
builder.setMessage(updateInfo.getDescription());
builder.setPositiveButton("确定", new OnClickListener() {}
builder.show();
5.获取sp中存储的数据。
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
boolean update = sp.getBoolean("update", false);
6.从服务端获取数据
URL url = new URL(getResources().getString(R.string.serverurl));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(2000);
int code = conn.getResponseCode();
if (code == 200) {
InputStream is = conn.getInputStream();
updateInfo = UpdateInfoParser.getUpdateInfo(is);
if (updateInfo != null) {
// 解析成功
Log.i(TAG, "解析成功,服务器版本:" + updateInfo.getVersion());
msg.what = PARSE_SUCCESS;
处理框架
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
7判断你的sd卡是否存在,然后下载文件
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if(code ==200){
File file = new File(savedPath);
int max = conn.getContentLength();
pd.setMax(max);
FileOutputStream fos = new FileOutputStream(file);
InputStream is = conn.getInputStream();
byte[] buffer = new byte[1024];
int len= 0;
int total = 0;
while((len = is.read(buffer))!=-1){
Thread.sleep(10);
fos.write(buffer, 0, len);
total+=len;
pd.setProgress(total);
}
is.close();
fos.close();
return file;
}
8.
欺骗系统 说我已经获取到了焦点
@Override
public boolean isFocused() {
return true;
}
9解析xml:
XmlPullParser parser = Xml.newPullParser();
UpdateInfo info = new UpdateInfo();
try {
parser.setInput(is, "UTF-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("version".equals(parser.getName())) {
String version = parser.nextText();
info.setVersion(version);
} else if ("description".equals(parser.getName())) {
String description = parser.nextText();
info.setDescription(description);
} else if ("path".equals(parser.getName())) {
String path = parser.nextText();
info.setPath(path);
}
break;
}
type = parser.next();
}
is.close();
return info;
10表格布局,和适配器。
gv_home = (GridView) findViewById(R.id.gv_home);
gv_home.setAdapter(new HomeAdapter(this));

11.sp的写数据
Editor editor = sp.edit();
if(sv_setting_update.isChecked()){
sv_setting_update.setChecked(false);
editor.putBoolean("update", false);
}else{
sv_setting_update.setChecked(true);
editor.putBoolean("update", true);
}
editor.commit();

12.显示activity的过程动画
overridePendingTransition(R.anim.trans_in, R.anim.trans_out);

13.获取sim卡的串号
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 1.获取用户的sim卡串号
String sim = tm.getSimSerialNumber();

14.选择联系人
/**
* 选择联系人
*/
public void selectContact(View view){
Intent intent = new Intent(this,SelectContactActivity.class);
startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(data!=null){
String number = data.getStringExtra("number");
et_setup3_safenumber.setText(number);
}
super.onActivityResult(requestCode, resultCode, data);
}
15成为设备的管理者。
比如锁屏,恢复出厂设置(这么和谐的东西要是在中国是不大可能提供给你的),
还有设置密码、强制清除密码,修改密码、设置屏幕灯光渐暗时间间隔等操作
public class MyAdmin extends DeviceAdminReceiver

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
//指定激活那一个组件
ComponentName mDeviceAdminSample = new ComponentName(this, MyAdmin.class);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceAdminSample);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
"开启我吧 ,哈哈哈,开启后有很多好处,你懂的");
startActivity(intent);

16.获取所有人的列表
List<ContactInfo> contactInfos = new ArrayList<ContactInfo>();
ContentResolver resolver = context.getContentResolver();
// raw_contact 表的uri
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// data 表的uri
Uri dataUri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
if (id != null) {
Cursor dataCursor = resolver.query(dataUri, new String[] {
"data1", "mimetype" }, "raw_contact_id=?",
new String[] { id }, null);
ContactInfo contactInfo = new ContactInfo();
while (dataCursor.moveToNext()) {
String data = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
if("vnd.android.cursor.item/name".equals(mimetype)){
contactInfo.setName(data);
}else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
contactInfo.setNumber(data);
}
}
contactInfos.add(contactInfo);
dataCursor.close();
}
}
cursor.close();

17.获取短信和短信体
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj: objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String sender = smsMessage.getOriginatingAddress();
String body = smsMessage.getMessageBody();

18锁频
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.resetPassword("123", 0);
dpm.lockNow();

19清除数据
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.wipeData(0);
//拦截短信
abortBroadcast();

20.播放音乐
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
player.setLooping(false);
player.setVolume(1.0f, 1.0f);
player.start();

21.获取你的gps位置
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
List<String> names = lm.getAllProviders();
for (String name : names) {
System.out.println(name);
}
// 查询条件
Criteria criteria = new Criteria();
// 精确度
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否运行产生开销
criteria.setCostAllowed(true);
// 电量的消耗
criteria.setPowerRequirement(Criteria.POWER_HIGH);
String provider = lm.getBestProvider(criteria, true);
System.out.println("最好的位置提供者:" + provider);
listener = mGpsInfoProvider.new MyListener();
lm.requestLocationUpdates(provider, 0, 0, listener);
-->
private class MyListener implements LocationListener {
// 当位置发生变化的时候 调用.
@Override
public void onLocationChanged(Location location) {
double longitude = location.getLongitude();
double latitude = location.getLatitude();
double accuracy = location.getAccuracy();
String result = "j:" + longitude + "\n" + "w:" + latitude + "\nac:"
+ accuracy;
Editor editor = sp.edit();
editor.putString("lastlocation", result);
editor.commit();
}

22.自定义的广播接受者
开机广播
<receiver android:name=".receiver.BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
短信到来广播
<receiver android:name=".receiver.SmsReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
设备管理者广播
<receiver
android:name=".receiver.MyAdmin"
android:description="@string/sample_device_admin_description"
android:label="@string/sample_device_admin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" />

<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>

23给edittext 注册一个文本变化的监听器
et_query_number.addTextChangedListener(new TextWatcher() {


24初始化震动器
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(100);

25外拨电话的广播
receiver = new InnerBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(receiver, filter);
wm = (WindowManager) getSystemService(WINDOW_SERVICE);

super.onCreate();
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 监听手机的电话状态
listener = new MyPhoneListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

private class MyPhoneListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 手机铃声响了...
String address = AddressDao.getAddress(incomingNumber);
// Toast.makeText(getApplicationContext(), address, 1).show();
showAddressInWindow(address);
break;

case TelephonyManager.CALL_STATE_IDLE:// 手机处于空闲状态.
if (view != null) {
wm.removeView(view);
view = null;
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}

}
26WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
在WindowManager中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。

首先,得到WindoeManager对象:
WindowManager wManager = getApplicationContext().getSystemService( Context. WINDOW_ SERVICE);

其次,得到WindowManager.LayoutParams对象,为后续设置相关参数做准备:
private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();

接着,设置相关的窗口布局参数,要实现悬浮窗口效果,主要需要设置的参数有:
wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type
wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
*/
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
wmParams.gravity = Gravity.RIGHT| Gravity. CENTER_VERTICAL; // 调整悬浮窗口至右侧中间
// 以屏幕左上角为原点,设置x、y初始值
wmParams.x = 0;
wmParams.y = 0;
// 设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;;
wmParams.height =WindowManager.LayoutParams.WRAP_CONTENT;;
然后,就可以将需要加到悬浮窗口中的View加入到窗口中了:
if(view.getParent==null)//如果view没有被加入到某个父组件中,则加入WindowManager中
wManager.addView(view,wmParams);
其中,view为需要放到悬浮窗口中的视图组件。
如果要将其从WindowManager中移除,则可以执行以下语句:
if(view.getParent()!=null)
wManager.removeView(view);
最后,还有需要注意的是,如果要用悬浮窗口,需要在AndroidManifest.xml中加入如下的权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

24.手势识别:
// 1. 初始化一个手指 触摸的监听器 监听手势事件.
mGestureDetector = new GestureDetector(this,
new GestureDetector.SimpleOnGestureListener() {
/**
* 手指在屏幕上滑动的时候 调用的方法
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {

if (Math.abs(velocityX) < 200) {
Log.i(TAG, "移动的太慢了...");
return false;
}

if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
Log.i(TAG, "动作非法");
return false;
}

if (e1.getRawX() - e2.getRawX() > 200) {// 向左滑动 显示下一个界面
showNext();
return false;
}

if (e2.getRawX() - e1.getRawX() > 200) {//
showPre();
return false;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}

// 当用户触摸activity的时候 调用.
@Override
public boolean onTouchEvent(MotionEvent event) {
// 2.让手势识别器 生效
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}

25.判断服务是否是运行的
// 1.获取到系统里面所有的正在运行的服务.
// am 相当于windows系统下的任务管理器
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> runningServiceInfos = am
.getRunningServices(100);
for (RunningServiceInfo info : runningServiceInfos) {
if (cls.getName().equals(info.service.getClassName())) {
return true;
}
}

26.使用sql
你可以直接使用sqlitedatabase的SQLiteDatabase.openDatabase(path, factory, flags)直接打开一个已经存在的
但是不存在的,你可以继承sqliteopenhelper这样可以使用了
public class BlackNumberDBHelper extends SQLiteOpenHelper {

public BlackNumberDBHelper(Context context) {
super(context, "blacknumber.db", null, 1);
}
//在第一次创建数据库的时候 调用.
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table blacknumber (id integer primary key autoincrement, number varchar(20), mode varchar(2) )");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}


public BlackNumberDao(Context context) {
this.context = context;
helper = new BlackNumberDBHelper(context);
}
/**
* 添加一条记录到数据库
* @param number 黑名单号码
* @param mode 拦截模式
*/
public boolean add(String number,String mode){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", number);
values.put("mode", mode);
long result = db.insert("blacknumber", null, values);
db.close();
if(result>0){
return true;
}else{
return false;
}
}

27.优化listview
private class CallSmsAdapter extends BaseAdapter {

@Override
public int getCount() {
return blackNumberInfos.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// Log.i(TAG,"调用了..."+position+"--convertView:"+convertView);

View view;
ViewHolder holder;// 声明一个view对象引用的容器.
// 第一步的优化,采用减少 view对象创建的次数
if (convertView != null && convertView instanceof RelativeLayout) {
// Log.i(TAG, "存在历史缓存view对象,复用他" + position);
view = convertView;
// 第二步的优化 ,减少了 孩子控件的查询操作.
holder = (ViewHolder) view.getTag();// 把刚才存在在view对象里面 孩子控件的引用
// 再获取出来.
} else {
// Log.i(TAG, "历史缓存view对象不存在,创建新的" + position);
// 非常占用资源的... 为了优化 减少他执行的次数
view = View.inflate(getApplicationContext(),
R.layout.list_call_sms_item, null);
holder = new ViewHolder();// 初始化 view对象引用的容器.
holder.tv_mode = (TextView) view
.findViewById(R.id.tv_call_sms_mode);
holder.tv_number = (TextView) view
.findViewById(R.id.tv_call_sms_number);
holder.iv_delete = (ImageView) view
.findViewById(R.id.iv_call_sms_delete);
// 现在holder里面存放的就是 孩子控件的引用.
// 希望 让这个holder 跟 当前的view对象 建立一个关系
view.setTag(holder);
}

BlackNumberInfo info = blackNumberInfos.get(position);
String number = info.getNumber();
holder.tv_number.setText(number);
String mode = info.getMode(); // "1" 全部 "2" 电话 "3" 短信
if ("1".equals(mode)) {
holder.tv_mode.setText("全部拦截");
} else if ("2".equals(mode)) {
holder.tv_mode.setText("电话拦截");
} else if ("3".equals(mode)) {
holder.tv_mode.setText("短信拦截");
}
holder.iv_delete.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Log.i(TAG, "删除按钮被点击了..." + position);
// 1.从数据库 把这个记录给移除掉.
BlackNumberInfo info = blackNumberInfos.get(position);
dao.delete(info.getNumber());
// 2. 从界面把这个条目给移除.
blackNumberInfos.remove(info);
// 3.通知界面刷新
adapter.notifyDataSetChanged();
}
});

return view;
}

}

/**
* 静态的view的容器. 里面存放 孩子控件id的引用. view对象在内存中的地址.
*
* @author Administrator
*
*/
static class ViewHolder {
TextView tv_mode;
TextView tv_number;
ImageView iv_delete;
}

如何优化?
主要是进行一些时间和空间的转化,你可以改变这些,来换取优化的条件。

28.利用反射挂断电话:
你在使用getsystemservice的时候,会用到的是实际上是ContextImpl的方法,这实际上系统会生成一个map存放你的服务
,在你的系统重启的时候,都可以看到注册服务的动作。

/**
* 删除呼叫记录
*
* @param incomingNumber
*/
public void deleteCallLog(String incomingNumber) {
Uri uri = Uri.parse("content://call_log/calls/");
getContentResolver().delete(uri, "number=?",
new String[] { incomingNumber });
}

/**
* 挂断电话.
* 需要添加一个call phone的权限
* @param incomingNumber
* 电话号码
*/
public void endCall(String incomingNumber) {
try {
Class clazz = getClassLoader().loadClass(
"android.os.ServiceManager");
Method method = clazz.getMethod("getService",
new Class[] { String.class });
// IBinder b = ServiceManager.getService(TELEPHONY_SERVICE);
IBinder b = (IBinder) method.invoke(null,
new String[] { TELEPHONY_SERVICE });
ITelephony iTeletphony = ITelephony.Stub.asInterface(b);
iTeletphony.endCall();

} catch (Exception e) {
e.printStackTrace();
}

30使用notifycation

//1.获取notification的服务
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//2.创建一个notification对象
Notification nofication = new Notification(R.drawable.notification, "发现一声响号码", System.currentTimeMillis());
//3.设置一些notification的参数
nofication.flags = Notification.FLAG_AUTO_CANCEL;
Intent intent = new Intent(this,CallSmsSafeActivity.class);
intent.putExtra("number", incomingNumber);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

nofication.setLatestEventInfo(this, "提醒,发现一声响号码", "号码为:"+incomingNumber, contentIntent);
//4.显示notification
nm.notify(0, nofication);

31创建一个快捷图标:
需要一个install_shortcut的权限
Intent intent = new Intent();
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "黑马卫士");
Intent shotCutIntent = new Intent();
shotCutIntent.setAction("com.itheima.mobielsafe.home");
shotCutIntent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shotCutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, BitmapFactory
.decodeResource(getResources(), R.drawable.app));
sendBroadcast(intent);

32.使用下拉的listview
也就是使用ExpandableListview,这样你可以添加适配器MyAdapter,这样,你就可以去下拉listview
private class MyAdapter extends BaseExpandableListAdapter {

优化:把每次查数据库的操作,你可以使用查内存

33popwindow的使用
popWindow = new PopupWindow(tv, 200, 200, true);
//注意:!!! popwindow窗体 不会有背景颜色. 没有背景颜色的窗体 焦点的获取 会产生问题.
// 窗体里面显示动画效果. 必须要求有背景.

popWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
View parent = findViewById(R.id.rl);
popWindow.showAtLocation(parent, Gravity.LEFT|Gravity.TOP, 100, 100);

34.定期执行任务

alarm的关键作用就是,你可以使用的定时是在alarm的进程中。
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(type, triggerAtMillis, operation);
一般可以使用countdown,你可以在3000的时间内每次减少的100
new CountDownTimer(3000,100) {

@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub

}

@Override
public void onFinish() {
// TODO Auto-generated method stub

}
};

35广播优先级
BroadcastReceiver所对应的广播分两类:普通广播和有序广播。
普通广播通过Context.sendBroadcast()方法来发送。它是完全异步的。
所有的receivers接收器的执行顺序不确定。 因此,所有的receivers接收器接收broadcast的顺序不确定。
这种方式效率更高。但是BroadcastReceiver无法使用setResult系列,getResult系列及abort系列API
有序广播是通过Context.sendOrderedBroadcast来发送。所有的receiver依次执行。
BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,
通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,
使用该广播不再传送到别的BroadcastReceiver。
可以通过在intent-filter中设置android:priority属性来设置receiver的优先级。
优先级相同的receiver其执行顺序不确定。
如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,
先注册的将先收到广播。

这个值从1000~-1000,数值越大,优先级别就越高

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。