手机安全卫士传智-卫士day_第1页
手机安全卫士传智-卫士day_第2页
手机安全卫士传智-卫士day_第3页
手机安全卫士传智-卫士day_第4页
手机安全卫士传智-卫士day_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、卫士讲师:Day872_得到的内存 ram 信息_411、参照金山卫士的进程管理2、创建 TaskManagerActvity 并在功能文件。布局文件基于管理界面修改一下。并且修改对应的文字和 ID;运行中的内存:tv_pros_count剩余/总内存:tv_mem_info初始化两个 TextView-memory 内存初始化 ActivityManager am;看一看里面要用到的方法;在.itheima.mobilesafe.utils 目录下创建SystemInfoUtils 工具类获取正在运行中进程的总个数:public sicgetRunningProsCount(Context

2、context) ActivityManageram=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);return am.getRunningAppProses().size();获取可用的内存信息 ramic long getAvailRam(Context context)public sActivityManageram=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);MemoryInfo outInfo = ne

3、w MemoryInfo(); am.getMemoryInfo(outInfo);return outInfo.availMem;/byte 为的 long 类型的可用内存大小获取可用的总内存信息 ramic long getTotalRam(Context context)public sActivityManageram=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);MemoryInfo outInfo = new MemoryInfo(); am.getMemoryInfo(outInfo);re

4、turn outInfo.totalMem;4、正在运行进程数量、可用 ram 内存、总内存定义成成员变量/正在运行的进程数量privaterunningProsCount ;/可用内存ramprivaong availRam ;/总的内存ramprivaong totalRam;显示部分代码tv_pros_count.setText(运行中的进程: + runningProsCount + 个);tv_mem_info.setText(剩余/总内存:+ Formatter.formatFileSize(this, availRam) + /+ Formatter.formatFileSize

5、(this, totalRam);5、解决 API 不兼容报错Problems 问题A,讲解报错的原因:在 16 版本才能用这个 API,文件最低支持 9B,解决方式-直接删除,运行正常显示;C,人为造错误,删除,运行演示,进入页面;6、了解处理器信息命令查看设备命名:adb devi进入某一个设备:adb -s emulator-5554 s看目录结构:ls进入 proc:cd proc查看里面文件:lsBingder 说明:绑定一个服务,返回一个 binder,虚拟的设备用它来表示;cpuinfo:处理器信息;详细列出文件信息命令:ls -l查看打开处理器文件信息命令:cat cpuinf

6、o处理器是奔腾 4 1500 兆赫兹相当于 2004 年 2005 年左右主流的处理器;所以我们模拟器运行起来比默认的要快得多。切换到 arm 模拟器 :ctrl+c进入 arm 模拟器:adb -s emulator-5556 s打开 cpuinfo 处理器文件:cat /prouinfo处理器是 393.21 兆赫兹,比加速的处理器速度慢 5 倍左右7.查看内存信息 meminfo 和 cpuinfo 在同一目录查看命令:cat meminfo到电脑打开计算器命令:calc计算可用总内存信息和金山计算出来的比较一下是否一样;MemFree 可用的内存空间Cached 缓存内存8、写具体读去

7、 meminfo 文件得到内存大小public sic long getTotalRam(Context context) try File file = new File(/proc/meminfo); FileInputStream fis = new FileInputStream(file); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis);/ MemTotal: 516452 kB * 1024 = byte String line = bufferedReader.readL

8、ine(); StringBuffer buffer = new StringBuffer(); for (char c : line.toCharArray() if (c = 0 & c = 9) buffer.append(c);return (egarse(buffer.toString() * 1024l); catch (Exception e) e.prStackTrace();return 0;知识拓展,有限山寨人为修改配置。就是修改设置页面的信息展示。市面上的,得到内存大小和信息也是这些文件的信息;例如:鲁大师,兔73_得到所有进程信息并显示_301、在 com.ithiem

9、a.mobilesafe.engine 目录下创建 TaskInfoProviderA:创建方法 getTaskInfos(Context context)用于得到系统正在运行的进程信息。B:创建实例 TaskInfopublic class TaskInfo private Drawable icon;private String name;/* byte*/ priva private private为ong memsize;userTask; String packageName;2、得到系统正在运行的进程信息public sic List getTaskInfos(Context co

10、ntext) List infos = new ArrayList();ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);ListprosInfos=am.getRunningAppPro/ 得到包管理器PackageManagses();m = context.getPackageManager();for (RunningAppProsInfo info : prosInfos) TaskInfo taskInfo= new TaskInfo();/ 注意导包a

11、ndroid.os.Debug.MemoryInfo MemoryInfo memoryInfo = am.getProsMemoryInf info.);/进程在虚拟机的大小/ memoryInfo1.dalvikPrivateDirty;/进程在本地运行的大小-jni调用的C代码运行的大小/ memoryInfo1.nativePrivateDirty;是kbmemory = memoryInfo0.getTotalPrivateDirty();/ 内存占用大小long memorySize = memory * 1024L; taskInfo.setMemSize(memorySize)

12、;/ 包名、进程名/String packageName = sName;taskInfo.setPackageName(packageName);try PackageInfo packInfo = pm.getPackageInfo(packageName, 0);/ 图标Drawable icon = packInfo.applicationInfo.loadIcon(pm);taskInfo.setIcon(icon);名称/Stringname=packInfo.applicationInfo.loadLabel(pm).toString();taskInfo.setName(nam

13、e);falgs = packInfo.applicationInfo.flags;if (falgs & ApplicationInfo.FLAG_SYSTEM)/ 用户进程taskInfo.setUserTask(true); else / 系统进程taskInfo.setUserTask(false); catch (NameNotFoundException e) / TODO Auto-generated catch block=0)e.prStackTrace();infos.add(taskInfo);return infos;3、在界面上显示信息A:初始化 ListView,和

14、加载效果布局list_task_item = (ListView) findViewById(R.id.list_task_item); ll_loading = (LinearLayout) findViewById(R.id.ll_loading);B:在 onCreate()创建方法fillData()并在里面创建线程,初始化数据。private void fillData() ll_loading.setVisibility(View.VISIBLE);new Thread()public void run() infosTaskInfoProvider.getTaskInfos(Ta

15、skManagerActivity.this); handler.sendEmptyMessage(0);.start();=C:数据加载好后,通知主线程更新界面。private Handler handler = new Handler()public void handleMessage(android.os.Message msg) adapter = new TaskInfoAdapter(); ll_loading.setVisibility(View.INVISIBLE); list_task_item.setAdapter(adapter);D:定义简单的 TextView 做

16、Item 先演示数据;4、解决部分程序进程没有名称-指定默认名称和;原理是:绝大多数应用都是标准的应用,对应 APK 文件,是有名称和包名的;但有些系统应用,是内核进程;是比较底层的,不是纯 Java 写的。主要是 C 写的。他们是没有名称的;所以获取名称失败;例如:s 系统内核进程system_pros.acore 内核进程As.media 多内核进程A拷贝一张名字叫:default.png到 drawble-hdpi 目录下提示invalid symbol 无效的符号原因是:default 与 Java 预留的关键字重名了,解决方案是改名一下;解决部分程序进程没有名称getTaskInfo

17、s()方法在异常代码处加上下面两行代码/系统内核进程没有名称,taskInfo.setName(packageName);就指定包名为它的名称taskInfo.setIcon(context.getResouricon);().getDrawable(R.drawable.default_74_带 CheckBox 的 ListView_301、自定义每条的 item 布局文件基于管理的 Item 修改一下名称和 ID在基础上增加 CheckBox2、在适配器的View 里面初始化并完成代码A:容器sic class ViewHolderImageView iv_icon;TextViewTe

18、xtView CheckBoxtv_name;tv_memsize; cb;B:getVeiw 具体代码Overridepublic View getView(View view = null;ition, View convertView,ViewGroup parent)ViewHolder holder = null;if(convertView != null&convertView instanceof RelativeLayout)view =holderelseviewconvertView;= (ViewHolder) view.getTag();=View.inflate(T

19、askManagerActivity.this,R.layout.list_task_item, null);holder = new ViewHolder(); holder.iv_iconview.findViewById(R.id.iv_icon);holder.tv_name view.findViewById(R.id.tv_name);holder.tv_memsizeview.findViewById(R.id.tv_memsize);=(ImageView)=(TextView)=(TextView)holder.cb = (CheckBox)view.setTag(holde

20、r);view.findViewById(R.id.cb);/取出进程信息TaskInfo info = infos.get(ition);holder.iv_icon.setImageDrawable(info.getIcon();holder.tv_name.setText(info.getName();holder.tv_memsize.setText(Formatter.formatFileSize(TaskManagerActivity.this, info.getMemSize();return view;3、用户进程和系统进程区分显示A:定义两个集合privaist userTa

21、skinfos;privaist systemTaskinfos;B:数据初始化,在fillData()里面加载数据;private void fillData() ll_loading.setVisibility(View.VISIBLE);new Thread()public void run() userTaskinfos =systemTaskinfosinfosnew ArrayList();= new ArrayList();=TaskInfoProvider.getTaskInfos(TaskManagerActivity.this);for(TaskInfo info : in

22、fos)if(info.getUserTask()/用户进程 userTaskinfos.add(info);else/系统进程 systemTaskinfos.add(info);handler.sendEmptyMessage(0);.start();C:在适配器里getCount()里加上+1 +1OverridepublicgetCount() return userTaskinfos.size()+1+systemTaskinfos.size()+1;D:在getView里面增加两个TextViewTaskInfo info = null;if(ition =0)TextView t

23、v = new TextView(TaskManagerActivity.this);tv.setBackgroundColor(Coltv.setTextColor(Color.WHITE); tv.setTextSize(20);RAY);tv.setText(用户进程(+userTaskinfos.size()+);return tv;else if(ition = (userTaskinfos.size() +1)TextView tv = new TextView(TaskManagerActivity.this);tv.setBackgroundColor(Coltv.setTex

24、tColor(Color.WHITE); tv.setTextSize(20);RAY);tv.setText(系统进程(+systemTaskinfos.size()+);return tv;else if(ition userTaskinfos.size() tv_sus.setText(系统进程: + systemTaskinfos.size(); else tv_sus.setText(用户进程: + userTaskinfos.size();4、勾选CheckBox拖动,会出现bug,每7条就会自动勾选;A:讲解原理,为什么会导致这样;是历史缓存View对象重复利用导致;B:要想解决

25、该问题,在TaskInfo 增加字段,并添加get和set方法;/是否被选中privateisChecked;C:点击每条没有效果-禁用CheckBox点击事件android:clickable=false android:focusable=false运行演示,已经有了点击效果D:设置点击每条事件,点击事件实现如下点击每条事件代码实现Object obj = list_task_item.getItemAtif(obj !=null)ition(ition);CheckBox cb = (CheckBox) view.findViewById(R.id.cb);TaskInfo taskIn

26、fo = (TaskInfo) obj;if(taskInfo.isChecked() cb.setChecked(false); taskInfo.setChecked(false);elsecb.setChecked(true); taskInfo.setChecked(true);E:在适配器getItem方法里修改成public Object getItem(ition) TaskInfo info = null;if(ition =0)returnelse if(returnelse if(null;ition = (userTaskinfos.size()null;+1)ition

27、 = userTaskinfos.size()newition =ition-1;info =elseinfo systemTaskinfos.get(userTaskinfos.get(newition);=ition-1-userTaskinfos.size()-1);return info;运行演示,还出现重复勾选;F:在getView()方法里加上校验代码holder.cb.setChecked(info.isChecked();运行演示看效果,已经解决重复勾选问题;75_实现全选&反选&一键&设置_351、在布局文件里面,增加全选、反选、一键、设置按钮ListViewandroid:

28、id=+id/list_task_item android:layout_width=fill_parent android:layout_height=fill_parentutton_contacts_selectorutton_contacts_selector2、代码实现全选、反选/*全选*/public void selectAll(View view)for(TaskInfo info : userTaskinfos) info.setChecked(true);for(TaskInfo info : systemTaskinfos) info.setChecked(true);a

29、dapter.notifyDataSetChanged();/*反选*/public void unSelect(View view)for(TaskInfo info : userTaskinfos) info.setChecked(!info.isChecked();for(TaskInfo info : systemTaskinfos) info.setChecked(!info.isChecked();adapter.notifyDataSetChanged();运行演示看一下效果。/*杀死选中的进程*param view*/public void killAll(View view)

30、 for (TaskInfo info : userTaskinfos) if (info.isChecked() /android.os.Pros.killPros();/am.killBackgroundProses(info.getPackageName();for (TaskInfo info : systemTaskinfos) if (info.isChecked() am.killBackgroundProses(info.getPackageName();/重新加载数据就可以了 fillData();杀进程需要限运行演示看效果;对应 DDMS 看到进行,演示杀死进程;系统进程杀

31、死后重启。知识拓展:杀死进程:android.os.Pros.killPros();3、杀死进程效果优化&提示杀死了多少个进程和内存信息查看金山卫士、和腾讯管家效果。publicvoid killAll(View view) total = 0;long saveMem = 0;for (TaskInfo info : userTaskinfos) if (info.isChecked() / android.os.Proam.killBackgroundPro total +;s.killPros();/ses(info.getPackageName();saveMem +=info.get

32、MemSize();userTaskinfos.remove(info);for (TaskInfo info : systemTaskinfos) if (info.isChecked() am.killBackgroundPrototal +;ses(info.getPackageName();saveMem +=info.getMemSize();systemTaskinfos.remove(info);/ 重新加载数据就可以了/ fillData();Toast.makeText(this, 杀 死 了 +total+ 个 进 程 ,了+Formatter.formatFileSize

33、(this, saveMem), 1).show();adapter.notifyDataSetChanged();运行演示:先杀最后一个,再杀中间进程报错。4、解决错误问题A:看日志:java.lang.IllegalSeException: Could not execute methodof the activity 不能执行 activity 这个方法Caused by: java.util.ConcurrentModificationException 并发更改的异常;原因是并发导致的,同时修改大小又要显示导致的。我在遍历的时候,是不可以更改大小的。演示杀最后面的这个,刚好是遍历好了

34、。所有不报错解决方案-把杀死的的单独放到集合里面去,遍历结束后;单独遍历该集合移除对应杀死的进程;B:红色代码表示修改好的publicvoid killAll(View view) total = 0;long saveMem = 0;List killedTaskInfo = new ArrayList();for (TaskInfo info : userTaskinfos) if (info.isChecked() / android.os.Proam.killBackgroundPro total+;s.killPros();/ses(info.getPackageName();sav

35、eMem += info.getMemSize();/ userTaskinfos.remove(info); killedTaskInfo.add(info);for (TaskInfo info : systemTaskinfos) if (info.isChecked() am.killBackgroundPrototal+;ses(info.getPackageName();saveMem += info.getMemSize();systemTaskinfos.remove(info); killedTaskInfo.add(info);/for(TaskInfo info : ki

36、lledTaskInfo)if(info.getUserTask()userTaskinfos.remove(info);elsesystemTaskinfos.remove(info);/ 重新加载数据就可以了/ fillData(); Toast.makeText(this,杀死了 + total + 个进程,了+Formatter.formatFileSize(this,saveMem),1).show();adapter.notifyDataSetChanged();5、解决全部杀死界面不好看,应该做相应;A:把卫士给掉,不让杀死自己;B:在适配器 getView()方法最后一行加上代

37、码if(info.getPackageName().equals(getPackageName()holder.cb.setVisibility(View.INVISIBLE);elseholder.cb.setVisibility(View.VISIBLE);C:在点击每一条的事件里也需要TaskInfo taskInfo = (TaskInfo) obj;if(taskInfo.getPackageName().equals(getPackageName()return;if (taskInfo.isChecked() cb.setChecked(false);taskInfo.setCh

38、ecked(false); else cb.setChecked(true); taskInfo.setChecked(true);D:在全选事件、反选事件地方加上如下代码在用户程序循环处:/* 全选*/public void selectAll(View view) for (TaskInfo info : userTaskinfos) if(info.getPackageName().equals(getPackageName() continue;info.setChecked(true);for (TaskInfo info : systemTaskinfos) info.setChe

39、cked(true);adapter.notifyDataSetChanged();/* 反选*/public void unSelect(View view) for (TaskInfo info : userTaskinfos) if(info.getPackageName().equals(getPackageName() continue;info.setChecked(!info.isChecked();for (TaskInfo info : systemTaskinfos) info.setChecked(!info.isChecked();adapter.notifyDataS

40、etChanged();6、更改内存的大小的显示;在 killAll()点击事件中最末尾添加代码runningProsCount -= total;availRam +=saveMem;tv_pros_count.setText(运行中的进程: + runningPro tv_mem_info.setText(剩余/总内存:sCount + 个);+ Formatter.formatFileSize(this, availRam) + Formatter.formatFileSize(this, totalRam);/可用内存+卫士占用内存!= 总内存 ; 为什么呢是因为里还运行一些纯 C 的

41、进程7、查看进程命令进入模拟题指令:adb -s emulator-5554s查看进程指令:ps演示杀掉 system_server:kill -9 10221022 为进程的 ID 好76_隐藏和显示系统进程&锁屏进程&定时器_341、创建新的类TaskManagerSettingActivity,并在文件配置;A:创建布局文件 activity_taskmanager_setting.xml,标题为:“进程设置管理”LinearLayout xmlns:android= HYPERLINK http:/s/ http:/s/apk/res/androidandroid:layout_wid

42、th=match_parentandroid:layout_height=match_parentandroid:orienandroid:id=+id/textView1android:layout_width=fill_parent android:layout_height=55dip android:background=#8866ff00 android:gravity=center android:text=进程设置管理 android:textColor=#000000 android:textSize=22sp /CheckBoxandroid:id=+id/cb_show_s

43、ystem_pro android:text=显示系统进程 android:layout_width=fill_parent android:layout_height=wrap_contents/B:实现点击事件,进入 TaskManagerSettingActivity2、在 TaskManagerSettingActivity 处理 CheckBox 的事件,并把状态保持起来。cb_show_system_pros=s);(CheckBox)findViewById(R.id.cb_show_system_prosp = getSharedPreferen(config, MODE_PR

44、IVATE);showsystem = sp.getif(showsystem)(showsystem, true);s.setText(当前状态:显示系统进程); s.setChecked(true);cb_show_system_procb_show_system_proelse cb_show_system_pros.setText(当前状态:不显示系统进程);cb_show_system_pros.setChecked(false);cb_show_system_pros.setOnCheckedChangeListener(newOnCheckedChangeListener() O

45、verridepublic void onCheckedChanged(CompoundButton buttonView,isChecked) if(isChecked)/选中cb_show_system_pros.setText(当前状态:显示系统进程);else/没有选中cb_show_system_pros.setText(当前状态:不显示系统进程);Editor editor = sp.edit();editor.putmit();(showsystem, isChecked););3、在 TaskManagerActivity 里的适配器处理显示和隐藏系统进程在适配器 getCou

46、nt()方法加上如下代码publicgetCount() SharedPreferensp = getSharedPreferen(config, MODE_PRIVATE);showsystem =sp.getif(showsystem)return userTaskinfos.size()elsereturn userTaskinfos.size()(showsystem, true);+ 1 + systemTaskinfos.size() + 1;+ 1;4、处理勾选后没有立即显示或隐藏A:在进入设置页面方法 enterSetting()startActivity(ent);-修改成s

47、tartActivityForResult(ent, 0);B:实现 activity 的 onActivityResult 的方法,里面实现如下代码:/当更新界面时/notifyDataSetChanged()-getCount()getView()adapter.notifyDataSetChanged();5、锁屏进程A:简单讲解金山锁屏进程的原理和 2 个小时后进程的缺陷B:在锁屏设置页面加载 CheckBox 用于勾选就锁屏。B:初始化代码,选中状态cb_auto_kill_pros=(CheckBox)findViewById(R.id.cb_auto_kill_pros);ent

48、(this,AutoKillService.class); usUtils.isRunningService(this,finalentent = newrunningService = Servicom.itheima.mobilesafe.service.AutoKillService);if(runningService)cb_auto_kill_pros.setText(当前状态:开启锁屏elsecb_auto_kill_pros.setText(当前状态:关闭锁屏杀进程);杀进程);cb_auto_kill_pros.setChecked(runningService);cb_aut

49、o_kill_proOnCheckedChangeListener()Overrides.setOnCheckedChangeListener(newpublic void onCheckedChanged(CompoundButton buttonView,isChecked) if(isChecked)cb_auto_kill_pros.setText(当前状态:开启锁屏杀进程);startService(elseent);cb_auto_kill_pros.setText(当前状态:关闭锁屏杀进程);stopService(ent););C:锁屏事件,只能在代码AutoKillServi

50、ce,系统设计能;因此创建新的服务在 onCreate()/锁屏广播锁屏广播receiver = new InnerScreenOffReceiver();entFilter filter = newentFilter();filter.addAction(ent.ACTION_SCREEN_OFF);registerReceiver(receiver, filter);在 onDestory()取消广播/取消广播unregisterReceiver(receiver);receiver = null;D:演示是否能到锁屏事件E:在服务里杀出进程/ 杀死进程的代码ActivityManager

51、 am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);List prosInfos = am.getRunningAppProses();for(RunningAppProsInfo info :prosInfos)sName);am.killBackgroundProses(6、使用 Timer 定期执行某个任务,在 TaskManagerSettingActivity 的 onCreate()方法里 A:定义成员变量private Timer timer;private TimerTask task;Timer 定时器B:在

52、onCreate()方法里timer = new Timer();task = new TimerTask() Overridepublic void run() System.out.prln(呵呵,我执行了);/task 要干的活,when第一次延迟多久 period每次间隔多久 timer.schedule(task, 1000, 5000);C:在 onDestroy()取消定时器timer.cancel();task.cancel(); timer = null; task = null;77_widget 简单入门_201、widget 简单入门A:widget,最初是由微软的 w

53、ord。Widget 微件的意思。后来,国内的一些杀毒厂商也使用,比如瑞星杀毒桌面上的狮子;在装有金山卫士的 2.3 模拟器长按桌面,高版本的模拟器有单独的窗口小;B:查看文档 Develop/API Guides /App WidgetApp Widgets are miniature application viewst can be embedded in otherapplications (such as the Home screen) and receive periodic updates. Theseviews are referred to as Widgetshe use

54、rerface, and you can publishi n App Widget provider. An application component t is able to hold other App Widgets is called an App Widget host. The screenshot below shows the Music App Widget.文档翻译:窗口小是一个微型的视图,可以嵌入在其他应用程序(如主屏幕)和接收定期更新。这些观点被称为用户界面中的控件,你可以发布一个应用程序的供应商。一个应用程序组件,可以容纳其他窗口小件的宿主。下面的截图显示了音乐应

55、用程序组件。被称为一个应用程序组2、创建 widget 必须要做的在.itheima.mobilesafe.receiver 目录下创建 MyWidget 并且继承 AppWidgetProviderB:在功能文件,参照文档,中间部分直接拷贝过来。meta-dataandroid:name=viderandroid:resource=xml/exle appwidget info /C:在 res/xml/创建文件exle_appwidget_info.xml 拷贝文档内容:D:讲解具体细节android:updatePeriodMillis:更新周期毫秒值这个值是一天个小时:1800000;

56、小时更新一次,写1000并没有生效,更新最小时间是半android:previewImage:预览;删除就是用默认的android:icon=drawable/ic_launcherandroid:initialLayout:初始的布局文件创建布局文件 app_widget.xml,布局文件有个简单的 TextViewandroid:configure:需要对应配置Activity才用到。这个不需要。android:resizeMode:横竖屏切换,指定大小如何去变化。android:widgetCategory=”home_screen|keyguard”分别在屏幕主页和锁屏状态也能显示;A

57、ndroid:initialKeyguardLayout=”layout/exle_keyguared”锁屏状态显示的样式E:exle_appwidget_info.xml 文件最终内容F:设置自定义布局文件背景红色,看看 widget 真实大小新版本模拟器显示要大一些,老版本模拟器显示要小一些;78_widget 抄布局&反编译_181、参照金山A:创建新卫士,反编译得到布局文件;令提示符窗口:切换目录命令:cd /d D:例如:卫士day8apktoolC:UsersAdministratorcd /d D:卫士day8apktoolB 反编译布局文件命令:apktool d 文件名称例如

58、:D:卫士day8apktoolapktool d com.ijinshan.mguard.1324644228599.apk如何快速找到资源文件根据文件去找 android.appwidget.action.APPWIDGET_UPDATE找对应的 android:resource解决报错对比市面上存在。搜索 网易腾讯,查看;知识拓展:反编译79_widget 的更新和生命周期_351、桌面上自己打开一个应用widget 一会就更新了,这不是跟之前讲的不一样了吗原因是谷歌默认的实现是这样的。金山卫士是自己实现了更新,代码更新内容;2、看打开金山卫士Widget 空间,看日志3、在服务包里创建

59、服务类 UpdateWidgetService继承Service,并在功能文件配置;A:定义计时器成类的成员变量private Timer timer;private TimerTask task;onCreate()方法里timer = new Timer();task = new TimerTask() Overridepublic void run() ;timer.schedule(task, 0, 5000);onDestroy 方法里取消定时器;Overridepublic void onDestroy() super.onDestroy(); timer.cancel();tas

60、k.cancel();timer = null;task = null;4、在定时器里更新桌面的widget其实更新另外一个进程的操作;IPC调用,进程间通信;A:使用AppWidgetManager 更新widget,定义成成员变量;private AppWidgetManager awm;更新appwidget状态;获取安装appwidget提供者和其他appwidget相关的状态信B:在onCreate地方实例化awm = AppWidgetManager.getInstance(this);C:定时器里RemoteViews类,继承序列化A classin anoth resource

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论