(转)Android中让应用程序自动安装到手机内存及判断应用程序是否安装在SDCard中...

本文介绍了如何通过修改AndroidManifest.xml文件中的android:installLocation属性来指定Android应用的安装位置,并提供了三种不同设置值的具体含义说明。
AI助手已提取文章相关产品:

上次写了个widget程序,安装好后准备把它添加到手机主页上,发现窗口小部件中找不到我刚刚安装的那个widget,网上查资料才发现系统窗口小部件只能先加载扫描安装在内存的应用程序,把属于widget的APP显示到小部件列表上。

对于开发者来说,怎样才能让应用程序自动安装到手机内存中去呢?

在 Android2.2版本及之后,AndoridManifest.xml 中有一个属性: android:installLocation ,可以通过设置这个属性的三个值 "auto" | "internalOnly" | "preferExternal",来决定将应用程序安装到哪里。

auto:

程序可能安装到外部存储介质上(例如,SDCard),但是默认会被安装到手机内存中,当手机内存为空时,程序将被安装到外部存储介质上。当程序安装在手机上后,用户可以在外部存储介质和手机内存上自行移动。

internalOnly(默认值):

当设置了该值后,程序只能安装在内存中,当手机内存为空时,安装不成功。

preferExternal:

将程序安装在外部存储介质上,但系统不保证程序一定会安装到外部存储介质上,当外部存储介质不可以或为空时,程序将被安装到内存中。若程序使用了forward-locking机制时也将被安装到内存中,因为外部存储不支持这种机制。程序安装后,用户同样可以在外部存储介质和内存之间自由移动。


当我们想知道应用程序是否安装在SDCard中时,可用如下语句判断:

[java] view plain copy
  1. /**
  2. *判断包名所对应的应用是否安装在SD卡上
  3. *@return,trueifinstallonSDcard
  4. */
  5. publicstaticbooleanisInstallOnSDCard(StringpackageName){
  6. PackageManagerpm=LauncherApplication.getApp().getPackageManager();
  7. ApplicationInfoappInfo;
  8. try{
  9. appInfo=pm.getApplicationInfo(packageName,0);
  10. if((appInfo.flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)!=0){
  11. returntrue;
  12. }
  13. }catch(NameNotFoundExceptione){
  14. e.printStackTrace();
  15. }
  16. returnfalse;
  17. }

转自:http://blog.youkuaiyun.com/shakespeare001/article/details/8171065

您可能感兴趣的与本文相关内容

<think>我们正在讨论的是Auto.js(或AutoX.js)中如何实现程序的自动重启或重新运行。根据用户提供的引用内容,我们了解到Linux系统中可以使用crontab来设置定时任务,包括重启任务。但在Auto.js环境中,我们通常是在Android设备上运行JavaScript脚本,因此需要不同的方法。 在Auto.js中实现自动重启,可以考虑以下几种方法: 1. **使用脚本自身设置定时重启**:在脚本中设置一个定时器,到达指定时间后重启脚本。 2. **使用系统工具**:利用Android系统的定时任务功能(如使用AlarmManager)来触发脚本重启,但Auto.js本身可能不直接支持,需要结合其他工具或插件。 3. **使用Auto.js提供的定时任务功能**:Auto.js有定时任务功能,可以通过脚本设置定时任务,在指定时间运行另一个脚本(用于重启当前脚本)。 这里我们重点讨论第一种方法,因为它在脚本内部实现,相对简单。但请注意,长时间运行的脚本可能会被系统杀死,因此第二种或第三种方法可能更可靠。 ### 方法1:使用setInterval或setTimeout定时重启 我们可以设置一个定时器,在指定的时间后重启脚本。重启脚本可以通过调用`engines.execScript()`来运行一个新的脚本实例,然后退出当前脚本。 示例代码: ```javascript // 设置6小时后重启(单位毫秒) const restartInterval = 6 * 60 * 60 * 1000; setTimeout(() => { // 重启脚本 let currentScriptPath = engines.myEngine().getSource().toString(); engines.execScriptFile(currentScriptPath); // 退出当前脚本 engines.myEngine().forceStop(); }, restartInterval); ``` 注意:这种方法有一个缺点,如果脚本被系统杀死,定时器也会被销毁,导致重启失败。 ### 方法2:使用Auto.js的定时任务 Auto.js提供了设置定时任务的功能,我们可以设置一个定时任务来启动脚本,然后当前脚本在运行一段时间后退出。定时任务可以通过`Timers`模块来设置。 首先,在脚本中设置一个定时任务,例如在每天特定时间重启,或者在一段时间后重启。但是,Auto.js的定时任务功能在4.0版本后需要结合应用自身的定时任务服务,并且可能受到系统限制。 示例代码(设置一个一次性定时任务): ```javascript // 引入Timers模块 let Timers = require('Timers'); // 设置6小时后执行重启任务 let restartTime = Date.now() + 6 * 60 * 60 * 1000; // 设置定时任务 Timers.setTimeout({ path: files.currentPath(), // 当前脚本路径 date: new Date(restartTime).toLocaleString(), // 需要换为日期字符串,但注意格式 }, function(err) { if (err) { console.error('设置定时任务失败:', err); } else { console.log('定时任务设置成功,将在'+restartTime+'执行'); } }); ``` 然后,我们需要在脚本中处理定时任务的触发。通常,定时任务会启动一个新的脚本实例,因此我们需要在脚本开始运行时判断是否是由定时任务触发的重启,然后执行相应的操作。 ### 方法3:使用AlarmManager和Intent(需要root或使用无障碍服务) 对于高级用户,可以通过发送Intent来设置系统闹钟,然后在闹钟触发时启动Auto.js并运行指定脚本。这需要编写一些Android相关的代码,并且可能需要设备root或者利用无障碍服务。 示例代码(需要root权限): ```javascript // 设置一个6小时后触发的Intent let intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(android.net.Uri.parse("script:"+files.currentPath())); // 假设Auto.js支持这种启动方式 let pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); let alarmManager = context.getSystemService(android.content.Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, java.lang.System.currentTimeMillis() + 6*60*60*1000, pendingIntent); ``` 注意:这种方法比较复杂,且需要处理Android权限问题。 ### 推荐方法 考虑到简单性和可靠性,对于一般用户,建议使用方法1(脚本内定时重启)结合异常处理,同时确保Auto.js应用在后台有足够的权限(如自启动、后台运行等)。如果脚本因为系统限制被频繁杀死,可能需要使用方法2(Auto.js定时任务)或者方法3(系统闹钟),但这需要更复杂的配置。 另外,也可以考虑使用循环运行的方式,即脚本执行完一次任务后,等待一段时间再执行,这样也可以达到类似重启的效果(但并不是真正的重启,而是重新执行任务)。 ### 相关问题 §§相关问题§§ 1. 在Auto.js中如何设置循环任务? 2. Auto.js脚本如何避免被系统杀死? 3. 如何利用Auto.js的定时任务功能实现每天定时执行脚本?</think>在AutoX.js中实现程序自动重启或重新运行,可以通过以下两种核心方法实现,结合系统特性和脚本控制: --- ### 方法1:脚本内循环重启(推荐) 通过`while`循环 + `try-catch`结构实现定时重启,核心代码: ```javascript // 主循环:失败自动重启 while (true) { try { main(); // 执行主任务函数 sleep(60000); // 任务完成后等待1分钟再重启(可选) } catch (e) { console.error("程序崩溃:", e); sleep(5000); // 错误后等待5秒重启 } } function main() { // 你的核心业务逻辑 // 例如:点击操作、数据采集等 click("按钮文字"); } ``` **优点**: - 无需系统权限 - 崩溃后立即自动重启 - 可自定义重启间隔 --- ### 方法2:系统定时任务(需Root) 通过Android的`AlarmManager`实现系统级定时重启(参考Linux cron原理[^1]): ```javascript // 设置每天凌晨2点重启 let alarm = context.getSystemService(android.content.Context.ALARM_SERVICE); let intent = new Intent(context, org.autojs.autojs.external.receiver.AlarmReceiver.class); intent.putExtra("path", scriptPath); // 脚本路径 let pending = PendingIntent.getBroadcast(context, 0, intent, 0); alarm.setRepeating( android.app.AlarmManager.RTC_WAKEUP, java.lang.System.currentTimeMillis() + 24*3600*1000, // 24小时后 24*3600*1000, // 重复间隔24小时 pending ); ``` **需额外配置**: 1. AndroidManifest.xml注册广播接收器 2. 设备开启自启动权限 3. AutoX.js后台白名单 --- ### 最佳实践建议 1. **循环重启方案** - 添加异常日志记录:`files.write("/sdcard/crash.log", e.stack)` - 内存优化:每次循环后调用`gc()`释放内存 ```javascript while (true) { try { main(); sleep(300000); // 5分钟重启间隔 } finally { gc(); // 强制垃圾回收 } } ``` 2. **系统级方案注意事项** - 需处理设备重启后任务丢失问题(通过`BOOT_COMPLETED`广播重新注册) - 避免过度唤醒导致耗电(使用`RTC_WAKEUP`替代`ELAPSED_REALTIME`) --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值