每日学习总结<二> 2015-9-1

Android:

     知识点:

  • 子线程中无法更新UI,因为UI是线程不安全的。

    • Android的UI单线程模式:

      1. 不能阻塞UI线程;
      2. 不能从UI线程的外部访问Android UI toolkit。
      3. 需要更新UI可以使用Handler传值。具体使用方式如学习总结五:

 

实践项目:

一键清理内存

功能:实现Android中,结束当前活跃APP进程,释放内存的Demo。

知识点:

  • ActivityManager的用法等等
 1 public String getMemoryState(Context context) {
 2
 3         ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 4         ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
 5         activityManager.getMemoryInfo(info);
 6 //                Log.e(MainActivity.TAG, "剩余内存" + (info.availMem >> 100000) + "M");
 7         Log.e(MainActivity.TAG, "是否处于低内存:" + info.lowMemory);
 8         Log.e(MainActivity.TAG, "threshold: " + info.threshold);
 9         memoryValueLong = (info.availMem / 1048576);
10         memoryValueString = Long.toString(memoryValueLong);
11         Log.e(MainActivity.TAG, "可用内存: " + memoryValueString + "MB");
12
13         return memoryValueString;
14     }
15
16     public long getMemoryValueLong(Context context) {
17         ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
18         ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
19         activityManager.getMemoryInfo(info);
20 //                Log.e(MainActivity.TAG, "剩余内存" + (info.availMem >> 100000) + "M");
21         Log.e(MainActivity.TAG, "是否处于低内存:" + info.lowMemory);
22         Log.e(MainActivity.TAG, "threshold: " + info.threshold);
23         memoryValueLong = (info.availMem / 1048576);
24         return memoryValueLong;
25     }
26
27     public void killProcess() {
28         ActivityManager activityManager2 = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
29         List<ActivityManager.RunningAppProcessInfo> infoList = activityManager2.getRunningAppProcesses();
30         List<ActivityManager.RunningServiceInfo> serviceInfoList = activityManager2.getRunningServices(200);
31         long beforeMem = getMemoryValueLong(MainActivity.this);
32         Log.d(TAG, "-----------before memory info : " + beforeMem);
33         int count = 0;
34         if (infoList != null) {
35             for (int i = 0; i < infoList.size(); ++i) {
36                 ActivityManager.RunningAppProcessInfo appProcessInfo = infoList.get(i);
37                 Log.e(TAG, "process name : " + appProcessInfo.processName);
38                 //importance 该进程的重要程度  分为几个级别,数值越低就越重要。
39                 Log.e(TAG, "importance : " + appProcessInfo.importance);
40                 // 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
41                 // 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
42                 if (appProcessInfo.importance > ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE) {
43                     String[] pkgList = appProcessInfo.pkgList;
44                     for (int j = 0; j < pkgList.length; ++j) {
45                         Log.e(MainActivity.TAG, "Killed package name: " + pkgList[j]);
46                         activityManager2.killBackgroundProcesses(pkgList[j]);
47                         count++;
48
49                     }
50                 }
51
52                 long clearAfeterMemoryState = getMemoryValueLong(MainActivity.this);
53                 Toast.makeText(MainActivity.this, "已清理内存:" + Long.toString(beforeMem - clearAfeterMemoryState) + " 当前内存为:  " + Long.toString(clearAfeterMemoryState), Toast.LENGTH_SHORT).show();
54             }
55
56
57         }
58     }
  • 创建快捷方式:
private void addShortCut() {
    Log.e(MainActivity.TAG, "====addShortCut()====");

    Intent shortCutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
    //快捷方式名称
    shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
    shortCutIntent.putExtra("duplicate", false);

    ComponentName componentName = new ComponentName(this.getPackageName(), "." + this.getLocalClassName());
    shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, new Intent(Intent.ACTION_MAIN).setComponent(componentName));

    //快捷方式的图标
    Intent.ShortcutIconResource iconResource = new Intent.ShortcutIconResource().fromContext(this, R.drawable.ic_launcher);
    shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
    sendBroadcast(shortCutIntent);

}
时间: 2024-11-09 02:14:50

每日学习总结<二> 2015-9-1的相关文章

操作系统学习 28/9/2015

操作系统学习 28/9/2015 虚拟内存:程序可以比内存大,允许执行程序不全在内存中,按需调页. 按需调页:通过设置有效无效位,有效表面该页合法且在内存中,无效表明该页不在进程的逻辑空间内或者该页合法但是在磁盘上.进程试图访问无效位的页时会产生错误陷阱,处理:1.检查进程内部页表,确定该引用是否合法,若非法,则终止进程,若合法,则调入该页面:2.在内存中找到一个空闲帧,将页面从磁盘掉入该帧中:3.修改进程的内部表和页表:4.继续该中断指令的执行.(重新对该指令进行获取,译码等) fork()调

ReactiveCocoa & MVVM 学习总结二

二. MVVM 1. 什么是MVVM From: https://github.com/ReactiveCocoa/ReactiveViewModel#model-view-viewmodel MVVM是指 Model-View-ViewModel的简称,与MVC的一个主要区别是 view 拥有view model.这个与MVC不一样,MVC中应该是controller拥有view.同时,view model 中应该不包含相关view的代码,这样以来,view model就是独立的,可以与任何v

Java 学习笔记(2015.7.20~24)

Java 学习笔记(2015.7.20~24) Java Java 学习笔记(2015.7.20~24) 1.StringBuffer与StringBuilder的区别: 2.基本数据类型包装类 3.Date.Calendar.DateFormat等与时间相关的类 1.常用类String 2.正则表达式 3.常用类 StringBuffer 代表可变的字符序列 拆箱与装箱 包装类的应用 匿名内部类 数组 day11 day12 day13 day14 day11 父类中使用public定义的方法

基于CentOS的Mysql学习补充二--使用Shell创建数据库

文章出处:基于CentOS的Mysql学习补充二--使用Shell创建数据库 关于使用基于命令使用mysql数据库的方法可见文章<基于CentOS的Mysql的使用说明>,本文只要介绍如何使用Shell脚本来创建我们想要的数据库,下面给出我创建数据库的Shell脚本,基本也就是将mysql的一些命令放在shell脚本里面而已. #!/bin/bash #Author: chisj #Time: 2015.7.22 #Describe: Create Database #The username

实测 《Tensorflow实例:利用LSTM预测股票每日最高价(二)》的结果

近期股市行情牛转熊,大盘一直下探!由3200跌到了2700,想必很多人被深套了.这时想起人工智能能否预测股市趋势?RNN能否起作用? 这时便从网上找下教程,发现网上有个例子,便拿来一试!Tensorflow实例:利用LSTM预测股票每日最高价(二) 这个实例大体上没有大问题,只是有些小细节有问题!要想直接复制运行,是会报错的.首先整下代码过程原作者已经写得很清楚了,但对于初学者来讲,有些地方还是不太明白的.我作为一个初学者,先来谈谈我在整个实测中的收获吧! 实例的思路:通过tushare可以获取

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

javascript基础学习(二)

javascript的数据类型 学习要点: typeof操作符 五种简单数据类型:Undefined.String.Number.Null.Boolean 引用数据类型:数组和对象 一.typeof操作符 typeof操作符用来检测变量的数据类型,操作符可以操作变量也可以操作字面量. 对变量或值运用typeof操作符得到如下值: undefined----如果变量是Undefined类型: boolean-------如果变量是Boolean类型: number-------如果变量是Numbe