查看测试机显示的内容所对应的Activity

先在环境变量Path中添加sdk所在的路径。

adb shell dumpsys activity 包名 | findstr ACTIVITY

App打包apk安装后重复启动根界面的问题

设我们应用启动页面会有一个SplashActivity启动界面,经过3s跳转到主界面MainActivity。

当我们点击apk文件安装app,安装完成界面点击打开按钮,点击Home键,进入系统桌面,此时app退到后台,再点击桌面上启动图标时。

在bug情况下启动app时,SplashActivity(app的根Activity)再次创建并叠加到Task任务栈上了。

解决方法:

在app的SplashActivity(app的根Activity)的onCreate方法中通过isTaskRoot()方法来判断是否是任务栈中的根Activity,如果是就不做任何处理,如果不是则直接finish掉;

PackageManager类

说明: 获得已安装的应用程序信息 。可以通过getPackageManager()方法获得。 常用方法:
public abstract PackageManager getPackageManager()
功能:获得一个PackageManger对象  public abstract Drawable getApplicationIcon(String packageName)
参数: packageName 包名
功能:返回给定包名的图标,否则返回nullpublic abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
参数:packagename 包名flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可
功能:返回该ApplicationInfo对象public abstract List<ApplicationInfo> getInstalledApplications(int flags)
参数:flag为一般为GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo的flags过滤,得到我们需要的。
功能:返回给定条件的所有PackageInfopublic abstract List<PackageInfo> getInstalledPackages(int flags)
参数如上
功能:返回给定条件的所有PackageInfopublic abstract ResolveInfo resolveActivity(Intent intent, int flags)
参数:  intent 查寻条件,Activity所配置的action和categoryflags: MATCH_DEFAULT_ONLY     :Category必须带有CATEGORY_DEFAULT的Activity,才匹配GET_INTENT_FILTERS     :匹配Intent条件即可GET_RESOLVED_FILTER    :匹配Intent条件即可
功能 :返回给定条件的ResolveInfo对象(本质上是Activity)public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags)
参数同上
功能 :返回给定条件的所有ResolveInfo对象(本质上是Activity),集合对象public abstract ResolveInfo resolveService(Intent intent, int flags)
参数同上
功能 :返回给定条件的ResolveInfo对象(本质上是Service)public abstract List<ResolveInfo> queryIntentServices(Intent intent, int flags)
参数同上
功能 :返回给定条件的所有ResolveInfo对象(本质上是Service),集合对象

利用应用程序打开目标类型文件

播放视频

Intent intent = new Intent(Intent.ACTION_VIEW);Uri uri = Uri.parse("file:///sdcard/media.mp4");intent.setDataAndType(uri, "video/*");startActivity(intent);

预防App调用第三方应用程序出现Crash处理方式

开发中我们经常会用到第三方应用程序的Activity和Service,但是你无法保证用户设备上安装了特定的某个应用软件,或者设备上有能够处理你的Intent请求的程序。

所以我们一般在调用前确定下是否可以将三方启动的界面解析为一个Activity,并判断它能否启动该intent

public void viewUrl(String url, String mimeType) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.parse(url), mimeType);if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {startActivity(intent);}else {// 找不到指定的Activity}
}

广播安全

对于只用于应用内的广播,优先使用LocalBroadcastManager 来进行注册和发送,LocalBroadcastManager 安全性更好,同时拥有更高的运行效率。

对于使用Context#sendBroadcast()等方法发送全局广播的代码进行提示。如果该广播仅用于应用内,则可以使用LocalBroadcastManager 来避免广播泄漏以及广播被拦截等安全问题,同时相对全局广播本地广播的更高效。

registerReceiver()和unregisterReceiver()要成对出现,onResume内注册广播则应该在onPause注销,onResume和onPause是成对的,如果在onDestory会出现多次注册一次注销的情况。

OnPause

当前Activity 的onPause 方法执行结束后才会创建(onCreate)或恢复(onRestart)别的Activity,所以在onPause 方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率。

Toast

使用 Toast 时,建议定义一个全局的 Toast 对象,这样可以避免连续显示 Toast 时不能取消上一次 Toast 消息的情况(如果你有连续弹出 Toast 的情况,避免使用 Toast.makeText)。

ViewHolder

使用 Adapter 的时候,如果你使用了 ViewHolder 做缓存,在 getView() 的方法中无论这项 convertView 的每个子控件是否需要设置属性(比如某个 TextView 设置的文本可能为 null,某个按钮的背景色为透明,某控件的颜色为透明等),都需要为其显式设置属性(TextView 的文本为空也需要设置 setText(“”),背景透明也需要设置),否则在滑动的过程中,因为 adapter item 复用的原因,会出现内容的显示错乱。

@Override
public View getView(int position, View convertView, ViewGroup parent) {ViewHolder myViews;if (convertView == null) {myViews = new ViewHolder();convertView = mInflater.inflate(R.layout.list_item, null);myViews.mUsername = (TextView) convertView.findViewById(R.id.username);convertView.setTag(myViews);} else {myViews = (ViewHolder) convertView.getTag();}Info p = infoList.get(position);String dn = p.getDisplayName;myViews.mUsername.setText(StringUtils.isEmpty(dn) ? "" : dn);return convertView;
}static class ViewHolder {private TextView mUsername;
}

Dialog

在 Activity 中显示对话框或者弹出浮层时,尽量使用 DialogFragment,而非 Dialog/AlertDialog,这样便于随 Activity 生命周期管理对话框/弹出浮层的生命周期。

public void showPromptDialog(String text) {DialogFragment promptDialog = new DialogFragment() {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);View view = inflater.inflate(R.layout.fragment_prompt, container);return view;}};promptDialog.show(getFragmentManager(), text);
}

SQLite

多线程操作写入数据库时,需要使用事务,以避免出现同步问题。

public void insertUserPhoto(SQLiteDatabase db, String userId, String content) {ContentValues cv = new ContentValues();cv.put("userId", userId);cv.put("content", content);db.beginTransaction();try {db.insert(TUserPhoto, null, cv); // 其他操作db.setTransactionSuccessful();} catch (Exception e) {// TODO} finally {db.endTransaction();}
}

执行 SQL 语句时,应使用 SQLiteDatabase#insert()、update()、delete(),不要使用 SQLiteDatabase#execSQL(),以避免 SQL 注入风险。

public int updateUserPhoto(SQLiteDatabase db, String userId, String content) {ContentValues cv = new ContentValues();cv.put("content", content);String[] args = {String.valueOf(userId)};return db.update(TUserPhoto, cv, "userId=?", args);
}

如果 ContentProvider 管理的数据存储在 SQL 数据库中,应该避免将不受信任的外部数据直接拼接在原始 SQL 语句中,可使用一个用于将 ?作为可替换参数的选择子句以及一个单独的选择参数数组,会避免 SQL 注入。

String mSelectionClause = "var = ?";
String[] selectionArgs = {""};
selectionArgs[0] = mUserInput;

Bitmap

加载大图片或者一次性加载多张图片,应该在异步线程中进行。图片的加载,涉及到 IO 操作,以及 CPU 密集操作,很可能引起卡顿。

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {...// 在后台进行图片解码@Overrideprotected Bitmap doInBackground(Integer... params) {final Bitmap bitmap = BitmapFactory.decodeFile("some path");return bitmap;}...
}

在 ListView,ViewPager,RecyclerView,GridView 等组件中使用图片时,应做好图片的缓存,避免始终持有图片导致内存泄漏,也避免重复创建图片,引起性能问题。建议使用 Fresco、Glide等图片库。

png 图片使用 tinypng 或者类似工具压缩处理,减少包体积。

Animation

在 Activity.onPause() 或 Activity.onStop() 回调中,关闭当前 activity 正在执行的动画。

public class MyActivity extends Activity {ImageView mImageView;Animation mAnimation;Button mBtn;/*** 首次创建 activity 时调用*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mImageView = (ImageView) findViewById(R.id.ImageView01);mAnimation = AnimationUtils.loadAnimation(this, R.anim.anim);mBtn = (Button) findViewById(R.id.Button01);mBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mImageView.startAnimation(mAnimation);}});}public void onPause() {//页面退出,及时清理动画资源mImageView.clearAnimation();}
}

在动画或者其他异步任务结束时,应该考虑回调时刻的环境是否还支持业务处理。例如 Activity 的 onStop() 函数已经执行,且在该函数中制动释放了资源,此时回调中如果不做判断就会空指针崩溃。

package com.niles.ndkdemo;public class MyActivity extends Activity {private ImageView mImageView;private Animation mAnimation;/*** 首次创建 activity 时调用*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mImageView = (ImageView) findViewById(R.id.ImageView01);mAnimation = AnimationUtils.loadAnimation(this, R.anim.anim);mAnimation.setAnimationListener(new AnimationListener() {@Overridepublic void onAnimationEnd(Animation arg0) {//判断一下资源是否被释放了if (mImageView != null) {mImageView.clearAnimation();}}});mImageView.startAnimation(mAnimation);}
}

大图片资源不要直接打包到 apk,可以参考通过文件仓库远程下载,减小包体积。

PendingIntent

使用 PendingIntent 时,禁止使用空 Intent,同时禁止使用隐式 Intent。

asyncTask 的execute和executeOnExecutor 方法

一个AsyncTask对象只能执行一次。

execute()方法,必须在UI线程调用,子线程可以只能在串行运行。

executeOnExecuter()方法子线程并行运行。

Activity中添加Fragment不能立刻获取到Fragment的上下文。

Android—开发过程中的相关注意事项相关推荐

  1. android开发过程中遇到的问题

    记录android开发过程中遇到的问题. 1.在一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android ...

  2. Android开发过程中的部分经验总结

    该文章为Android App 开发过程中遇到的常见问题总结,该总结也会持续不断的优化 完善当中.后续开发中一定会遇到各种各样的问题, 这些问题会酌情不断补充进来. 我将遇到的问题分为两大类,非技术问 ...

  3. android 开发过程中涉及到的清除缓存操作

    android 开发过程中会遇到很多缓存,常常使人摸不清楚,这里总结一下,希望下次遇到缓存相关问题能有所帮助. Clean Project 点击 Clean Project 会执行 clean.:ap ...

  4. android开发过程中一些遇到的问题

    记录android开发过程中遇到的问题. 1.在一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android ...

  5. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  6. Android开发过程中的一些基本常识

    http://blog.csdn.net/ekeuy/article/details/42292589 本文介绍Android开发过程中的一些基本常识,大多是一些流程.专业术语和解决问题的方法等. 一 ...

  7. 记录的Android开发过程中遇到的问题。

    180508  更新 网上下载demo 本地studio版本和demo版本不一致处理方式 修改两处 1 项目的build.gradle 里面classpath 2修改项目目录下 gradle--> ...

  8. 搬砖之路----MusicPlayer 一个基于Vlc(2.0+)开发的android音乐播放器--浅析在android开发过程中播放器选择之路!

    前言 MusicPlayer 是一款基于vlc播放器开发的一个音乐播放器,你也可以理解为在此核心上的搬砖之路,核心的内容并不是我写的,因此在正式写blog之前,感谢那些vlc核心的开发人员让我用到这么 ...

  9. 开发过程中 勘误表errata注意事项

    IC同基础元器件一样,是电路设计的基石,但绝大部分IC 并非同欧姆定律一般完美可靠,许多都存在Bug.原厂一般在优化过程中 会 推出errata(勘误表), 开发过程中我们往往将精力都投入在datas ...

最新文章

  1. 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
  2. mysql 原理 ~ 索引通说
  3. docker 导入导出镜像
  4. html中的点击事件
  5. linux适应环境,Linux从入门到适应(一):VSCode C++环境配置
  6. @RequestBody配合@JsonFormat注解实现字符串自动转换成Date
  7. click()和onclick()的区别
  8. 用户名和密码都正确,无法直接登陆虚拟机上的linux
  9. python tablewidget 颜色_更改QTableWidget的默认选择颜色,并使其半透明
  10. 【课程作业】表达学习 人脸图像复原 实验记录
  11. php mysql插入多个列_php mysql插入多条记录
  12. 新建Scrapy项目
  13. 怎样提高团队管理能力7
  14. react-native升级到0.63ios图片不展示
  15. Python.密码本生成
  16. css textarea行数_关于textarea元素的cols和rows属性
  17. react仿微信聊天室|react即时聊天IM系统|react群聊
  18. python气泡图的地图_Python数据可视化:香港地图、房价可视化,绘制气泡图
  19. 一次项目开发中,收获的经验和教训
  20. 04-0006 MATLAB 弹幕壁纸

热门文章

  1. 栏目图片 栏目描述_昕街拍|长期福利栏目来啦,秀街拍赢礼品!
  2. CAN总线抗干扰的六种解决方案
  3. android 自定义view实现拖动放大缩小_自定义itemCheckView
  4. sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
  5. oracle awr 数据删除,Oracle AWR 删除历史快照 说明【转自dave偶像大神】
  6. java 日历类_JAVA 的日历类型
  7. drawboard pdf拆分文件_PDF处理神器,几秒钟搞定格式转换+压缩+加水印+解密!
  8. 西安理工大学 计算机考研不分专硕学硕吗,2021年西安理工大学计算机科学与工程学院考研专业目录_研究生考试范围 - 学途吧...
  9. C语言荣获2019年度最佳编程语言
  10. sizeof你真的弄明白了吗?来看看这个例子