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

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);




你可能感兴趣的:(Android应用开发常用知识(2))