编写:徐建祥(netpirate@gmail.com)
日期:2010/12/13
网址:http://www.anymobile.org
打开程序的入口有很多个:
shell 命令行运行;
Launcher待机界面执行;
状态通知栏运行;
桌面快捷方式运行;
软件中调用运行;
安装软件后执行“OPEN”运行!
前面几项,调用程序的代码如下(参考:com.android.Launcher/.Launcher.java):
而安装软件后,点击“Open”调用的代码如下(参考:com.android.packageinstaller/.InstallAppDone.java):
如果用户安装软件后立刻执行“Open”,运行程序后,按HOME键返回到后台,然后再通过别的几种方法运行程序,则会再起一个MAIN程序。这是因为Intent的处理机制是,先比较Activity,再比较Action、Flag、bnds。。。,前后两张方式的Action不一样,一个有LAUNCHER ACTION,一个没有,所以会认为是启动两个不同的INTENT。
目前只想到一个简单的处理方式:
程序入口MAIN程序:SplashActivity.java
程序原入口程序:LoginActivity.java
启动程序后,在状态通知栏上添加快捷通知,代码如下:
android:launchMode="singleInstance"
试试。
android:launchMode="singleInstance"
试试。
谢谢,管用
比如我们的根activity为A,给A设置singleInstance.
当只有一个A时没有问题,但当A上面有其它Activity时,就有问题的,比如A上面有B,C
这样当按home切回桌面,再次点击应用程序图标时,程序又返回到A而不是C!
显然通常情况下我们想要回到C的。
我也在寻找合适的解决办法。
- 1 在一个应用中怎么启动另外一个应用
- 2 activity四种模式启动
- 3 怎么让一个应用适应不同的屏
- 4 生成一个随机的不重复4位数解决办法
- 5 返回一个不重复的随机数,该如何解决
- 1 十分难缠的signal 11 (SIGSEGV)
- 2 Can't create handler inside thread that has not called Looper.prepare() 错误有关问题
- 3 Dex Loader Unable to execute Multiple dex files define解决办法
- 4 解决 Google Play下载施用 "Google Play Store 已停止运行"
- 5 WAP网页获得用户的手机号码
- 6 如何判断Activity是否在运行
- 7 SlidingMenu+ViewPager兑现侧滑菜单效果
- 8 makeKeyAndVisible的功用
- 9 关于Unable to execute dex: Java heap space 解决方法
- 10 RelativeLayout设置居中对齐有关问题
- 1 播发声音文件AVAudioPlayer
- 2 改变银屏显示方式已经加载图片
- 3 2013-十-31 TCP/IP 协议簇
- 4 Java I/零 总体框架图
- 5 拿碗的铠甲勇者
- 6 女友可能出轨 想知道在QQ和别人的聊天记录
- 7 objective C中的字符串(3)
- 8 java.lang.ClassNotFoundException: Didn't find class "Activity" on path: /da
- 9 LG Optimus G Pro 相干
- 10 怎么创建对话框
- 1 疑惑为什么报错了
- 2 Tiledmap编辑操作技巧
- 3 power键跟音量键组合实现截图功能
- 4 用 lipo 下令裁剪出需要的 architecture
- 5 深入viewgroup.onintercepttouchevent1点
- 6 Andriod耗时操作的处置(音乐播放器欢迎界面)
- 7 BroadcastReceiver要领
- 8 MGTemplateEngine模版发动机
- 9 实现默认文字统制的textview
- 10 视图切换的形式
- 上一篇: 应用ActivityGroup来切换Activity和Layout
- 下一篇: 文件夹权限唤起的MediaPlayer播放不正常
写了一个Ap,在程序运行时会解压一些声音文件到/data/data/app_dir目录。
在调用Mediaplayer来播放这些文件时,总是提示失败,在网上搜到有提到权限的问题,把目录改成所有人可读写即可播放,验证后ok。
分析原因是MediaPlayer是个服务,是在另一个进程也是另一个用户的,默认创建的声音文件对其是不可读的,导致无法读取数据,在MediaPlayer.prepare()时总是失败。
但是每次修改目录的权限是不现实的,所以可以先把文件打开,然后把文件句柄传给MediaPlayer,这是MediaPlayer就可以通过此句柄获取到数据。
MediaPlayer.setDataSource((new FileInputStream(new File(soundFilePath))).getFD());
10月份买了HTC Desire,但是总担心耗电问题,android好友碰面聊得最多的估计就是手机耗电怎么样,看看论坛里面的ROM,都写着稳定、省电......
ROM刷了不低于8个了,也没发现特别省电的,也懒得折腾了,为了省电,每天晚上睡觉前开启飞行模式,早上起来再切换回去,但是老这样也很麻烦,索性写了个定时切换飞行模式的小程序。大体功能如下:
1、指定开启飞行模式的时间
2、指定关闭飞行模式的时间
3、可以开启定时切换,也可以关闭定时切换
分析了一下,发现有这样几个难点:
1、当然是开启飞行模式以及如何关闭飞行模式
2、如何在指定的时间开启飞行模式以及关闭飞行模式
3、重复
开启与关闭飞行模式的代码还是比较简单的,它是采用广播的形式:
try { ContentResolver cr = context.getContentResolver(); if( state && System.getString(cr,System.AIRPLANE_MODE_ON).equals("0") ){ System.putString(cr,System.AIRPLANE_MODE_ON, "1"); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", true); context.sendBroadcast(intent); }else if( !state && System.getString(cr,System.AIRPLANE_MODE_ON).equals("1") ){ System.putString(cr,System.AIRPLANE_MODE_ON, "0"); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", false); context.sendBroadcast(intent); } } catch (Exception e) { // e.printStackTrace(); Toast.makeText(context, "设置飞行模式状态失败", Toast.LENGTH_SHORT).show(); }
通过设置System.AIRPLANE_MODE_ON值为0或者为1,然后通过intent来发布广播。
第二点,就需要用到闹钟了,闹钟换句话就是一个定时器,只是闹钟的时间到了之后,播放闹钟铃声。在这里我们可以设置两个闹钟,在闹钟的时间到了之后分别开启飞行模式和关闭飞行模式,关于第三点重复也是在闹钟中设置的,关键代码如下:
//设置日历的时间,主要是让日历的年月日和当前同步 calendar.setTimeInMillis(java.lang.System.currentTimeMillis()); //设置日历的小时和分钟 calendar.set(Calendar.HOUR_OF_DAY, sh); calendar.set(Calendar.MINUTE, sm); //将秒和毫秒设置为0 calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); //建立Intent和PendingIntent来调用闹钟管理器 Intent startIntent = new Intent(ALARM_ACTION_START); startIntent.putExtra("startState", 1); PendingIntent startPendingIntent = PendingIntent.getBroadcast(TimerAirPlaneMode.this, 0, startIntent, 0); //获取闹钟管理器 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); //设置开始时间对应的闹钟 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60*1000, startPendingIntent);
上面的代码就是设置闹钟的,最后一行代码就是设置重复闹钟的。
这里还有一个问题是需要解决的,那就是如何同时设置多个闹钟,这个花了我一点时间,最后发现是通过PendingIntent.getBroadcast(TimerAirPlaneMode.this, 1, endIntent, 0);的第二个参数来定义一个新的闹钟。
然后就是关闭闹钟了:
Intent intent = new Intent(ALARM_ACTION_START); PendingIntent pendingIntent = PendingIntent.getBroadcast(TimerAirPlaneMode.this, 0, intent, 0); //获取闹钟管理器 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); //取消开始和结束闹钟 alarmManager.cancel(pendingIntent);
关闭闹钟首先要得到生成闹钟的PendingIntent,这个时候需要注意多个闹钟需要独立取消。
到这里关键代码基本上没有了,剩下的就是数据存储问题了,如何在下次启动程序的时候,自动读取上一次的数据,避免重复设置,这里需要用到SharedPreferences,用它来存储数据以及读取数据。
Log.d(TAG, "set the time:"+h+":"+m); SharedPreferences preferences = getSharedPreferences("TimerAirPlaneMode", 0); SharedPreferences.Editor editor = preferences.edit(); editor.putInt("flag", flag?1:0); if( flag ){ editor.putInt("startHour", h); editor.putInt("startMinute", m); } else { editor.putInt("endHour", h); editor.putInt("endMinute", m); } editor.commit();//这步很关键
SharedPreferences preferences = getSharedPreferences("TimerAirPlaneMode",MODE_PRIVATE); int sh = preferences.getInt("startHour", -1); int sm = preferences.getInt("startMinute", -1);
这里要注意,最后的提交commit很关键,要不然数据是不会写入到文件中去的,上面的第二部分代码是从SharedPreferences中读取数据。
下面是程序的运行效果:
招着你的代码抄了一份。。。哈哈,谢谢了。
我的邮箱13973061177@139.com
谢谢
我的邮箱13973061177@139.com
谢谢
很早以前写的了!
你直接下载这个zip文件,解压之后,里面包含源代码以及apk安装包。
其中apk安装包在bin目录里面。
你也可以把源代码导入eclipse,自己加以修改或者美化。