您的位置:首页 > 移动开发 > Android开发

Android应用开发常用知识(2)

2014-09-27 16:07 267 查看

1、关于android.permission.STOP_APP_SWITCHES权限

http://blog.csdn.net/ixiaobu/article/details/18226917

如果你想通过Service把home到后台的Activity启动到前台来,你有两种办法:

1)、startActivity(i)的方法

Intent i = new Intent(mActivity,MyActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);


2)、moveTaskToFront的方法:

ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
am.moveTaskToFront(mActivity.getTaskId(), 0);


但同时有两个问题:

1)、第一种方法:等几秒钟Activity才显示出来

2)、第二种方法:根本不起左右

这是你需要在AndroidManifest.xml中添加"android.permission.STOP_APP_SWITCHES"用户权限,前提是必须是系统应用才可以,具体可参考链接中的解释

2、Service的onStartCommand4种返回值所代表的意义

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

3、Android判断网络是否连接

private boolean isNetworkConnected(){
ConnectivityManager connManager = (ConnectivityManager) mProxy.getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connManager != null && connManager.getActiveNetworkInfo() != null &&
connManager.getActiveNetworkInfo().isConnected()){
return true;
}
return false;
}


4、Andrioid判断应用是否安装

private boolean isAppInstalled(String pkgName){
PackageInfo packageInfo = null;
try {
packageInfo = mContext.getPackageManager().getPackageInfo(pkgName, 0);
} catch (NameNotFoundException e) {
//e.printStackTrace();
}
if(packageInfo != null){
return true;
}else{
return false;
}
}


5、Fragment setUserVisibleHint(true)的用法

在使用ViewPager和Fragment实现三个TAB切换时发现,有两个Fragment的内容不会预加载,对每个Fragment设置setUserVisibleHint(true)以后就解决了这个问题。

6、Android clipToPadding和clipChildre

clipToPadding就是说控件的绘制区域是否在padding里面的,true的情况下如果你设置了padding那么绘制的区域就往里缩,clipChildren是指子控件是否超过padding区域,这两个属性默认是true的

7、ComponentCallbacks和ComponentCallbacks2

如果在不是系统提供的组件内要使用onConfigurationChanged或者onLowMemory的话可以用下面方法实现:

public static class MyCallback implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}

@Override
public void onLowMemory() {
//do release operation
}
}


ComponentCallbacks2可以提供onTrimMemory函数

然后,通过Context.registerComponentCallbacks ()在合适的时候注册回调就可以了

8、android:splitMotionEvents

定义布局是否传递touch事件到子布局,true表示传递给子布局,false表示不传递

9、android:clipChildren

是否限制子控件的绘图区域,即是否允许子控件区域超出父图。"true"表示限制,"false"表示不限制

10、Android开发中高效的数据结构用SparseArray代替HashMap

11、CopyOnWriteArrayList

使用CopyOnWriteArrayList CopyOnWriteArraySet来解决ConcurrentModificationException问题;

12、onTouchEvent中处理长按事件

if (action == MotionEvent.ACTION_UP) {
if((event.getEventTime() - event.getDownTime()) > ViewConfiguration.getLongPressTimeout())
return true;
}


13、Android开发中,那些让你相见恨晚的方法、类或接口

http://liukun.engineer/2016/04/11/Android%E5%BC%80%E5%8F%91%E4%B8%AD%EF%BC%8C%E9%82%A3%E4%BA%9B%E8%AE%A9%E4%BD%A0%E7%9B%B8%E8%A7%81%E6%81%A8%E6%99%9A%E7%9A%84%E6%96%B9%E6%B3%95%E3%80%81%E7%B1%BB%E6%88%96%E6%8E%A5%E5%8F%A3/
https://www.zhihu.com/question/33636939/answer/57239990?group_id=612750833369153536

14、android:fillViewport

当ScrollView里的元素想填满ScrollView时,使用"fill_parent"是不管用的,必需为ScrollView设置:android:fillViewport="true"。

15、Android通知栏下拉后,当前Activity的生命周期变化

不会调用onPause,会调onWindowFocusChanged。

Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。

比如我们在做OTT项目时候,我们就是在这onWindowFocusChanged来获取主按键的具体位置和宽高的,而在其他标准生命周期的接口中调用都是获取不到的,比如在onResume,onStart中都获取不到信息。

这个onWindowFocusChanged指的是这个Activity得到或者失去焦点的时候 就会call。。

也就是说 如果你想要做一个Activity一加载完毕,就触发什么的话 完全可以用这个!

16、Android利用广播监听设备安装和卸载应用程序

mAppBroadcastReceiver=new AppBroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.PACKAGE_ADDED");
intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
intentFilter.addDataScheme("package");
this.registerReceiver(mAppBroadcastReceiver, intentFilter);


<receiver android:name="cn.testappaddandremove.AppBroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data   android:scheme="package" />
</intent-filter>
</receiver>


17、查询是否有支持某个Uri或者mimetype的activity

public boolean checkSchemaOK(String uri) {
if(mContext == null)
return false;
boolean checkSchemaOK = false;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uri));
checkSchemaOK = intent.resolveActivity(mContext.getPackageManager()) != null;
return checkSchemaOK;
}


18、Android让ListView记住上次滑动到的位置

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();

// ...

// restore
mList.setSelectionFromTop(index, top);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: