当前位置:  编程技术>移动开发
本页文章导读:
    ▪不同的模式启动一个应用,解决不重复启动相同的Activity的方式        不同的方式启动一个应用,解决不重复启动相同的Activity的方式 Android 安装软件后执行“OPEN”引起的Intent血案(系统BUG) 编写:徐建祥(netpirate@gmail.com) 日期:2010/12/13 网址:http://www.anymobile.........
    ▪ 文件夹权限唤起的MediaPlayer播放不正常        文件夹权限引起的MediaPlayer播放不正常 写了一个Ap,在程序运行时会解压一些声音文件到/data/data/app_dir目录。在调用Mediaplayer来播放这些文件时,总是提示失败,在网上搜到有提到权限的问.........
    ▪ 发一个省电小程序-定时切换飞行模式       发一个省电小程序---定时切换飞行模式   10月份买了HTC Desire,但是总担心耗电问题,android好友碰面聊得最多的估计就是手机耗电怎么样,看看论坛里面的ROM,都写着稳定、省电...... ROM刷了.........

[1]不同的模式启动一个应用,解决不重复启动相同的Activity的方式
    来源: 互联网  发布时间: 2014-02-18
不同的方式启动一个应用,解决不重复启动相同的Activity的方式

Android 安装软件后执行“OPEN”引起的Intent血案(系统BUG)

编写:徐建祥(netpirate@gmail.com)

日期:2010/12/13

网址:http://www.anymobile.org

打开程序的入口有很多个:

shell 命令行运行;

Launcher待机界面执行;

状态通知栏运行;

桌面快捷方式运行;

软件中调用运行;

安装软件后执行“OPEN”运行!

前面几项,调用程序的代码如下(参考:com.android.Launcher/.Launcher.java):

 

view plaincopy to clipboardprint?
  • Intent intent = new Intent(this, TestActivity.class);  
  • intent.setAction(Intent.ACTION_MAIN);  
  • intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  • intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  • intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  • this.startActivity(intent);  
  •  

     

    而安装软件后,点击“Open”调用的代码如下(参考:com.android.packageinstaller/.InstallAppDone.java):

     

    view plaincopy to clipboardprint?
  • Intent intent = new Intent(this, TestActivity.class);  
  • this.startActivity(intent);  
  •  

     

    如果用户安装软件后立刻执行“Open”,运行程序后,按HOME键返回到后台,然后再通过别的几种方法运行程序,则会再起一个MAIN程序。这是因为Intent的处理机制是,先比较Activity,再比较Action、Flag、bnds。。。,前后两张方式的Action不一样,一个有LAUNCHER ACTION,一个没有,所以会认为是启动两个不同的INTENT。

    目前只想到一个简单的处理方式:

    程序入口MAIN程序:SplashActivity.java

    程序原入口程序:LoginActivity.java

    启动程序后,在状态通知栏上添加快捷通知,代码如下:

     

    view plaincopy to clipboardprint?
  • package org.anymobile.test;  
  • import android.app.Activity;  
  • import android.app.Notification;  
  • import android.app.NotificationManager;  
  • import android.app.PendingIntent;  
  • import android.content.ComponentName;  
  • import android.content.Context;  
  • import android.content.Intent;  
  • import android.os.Bundle;  
  • public class SplashActivity extends Activity  
  • {  
  •     @Override  
  •     protected void onCreate(Bundle savedInstanceState)  
  •     {  
  •         super.onCreate(savedInstanceState);  
  •           
  •         this.showNotification(this.getBaseContext(), -1, "Test is Running!", "Test Start Up!");  
  •           
  •         Intent intent = this.getIntent();  
  •         if (intent.hasCategory(Intent.CATEGORY_LAUNCHER))  
  •         {  
  •             intent = new Intent(this, TestActivity.class);  
  •             this.startActivity(intent);  
  •         }  
  •         else  
  •         {  
  •             intent = new Intent();  
  •             ComponentName componentName = new ComponentName(this, SplashActivity.class);  
  •             intent.setComponent(componentName);  
  • //          intent = new Intent(this, SplashActivity.class);  
  •               
  •             intent.setAction(Intent.ACTION_MAIN);  
  •             intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  •             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  •             intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  •               
  •             this.startActivity(intent);  
  •         }  
  •           
  •         this.finish();  
  •     }  
  •     public void showNotification(Context context,int iResIcon,String sNotifybar,String sNofitymsg)  
  •     {  
  •         // look up the notification manager service  
  •         NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);  
  •         // The details of our fake message  
  •         CharSequence from = "Test";  
  •         CharSequence message = sNofitymsg;  
  •           
  •         Intent intent = new Intent();  
  •         ComponentName componentName = new ComponentName(context, TestActivity.class);  
  •         intent.setComponent(componentName);  
  •           
  •         intent.setAction(Intent.ACTION_MAIN);  
  •         intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  •         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  •         intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  •           
  •         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);  
  •         Notification notification =   
  •             new Notification(iResIcon,sNotifybar, System.currentTimeMillis());  
  •         notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;  
  •         notification.defaults =   
  •             /*Notification.DEFAULT_SOUND|*/Notification.DEFAULT_LIGHTS;  
  •         notification.setLatestEventInfo(context, from, message, contentIntent);  
  • line-height: 18px; color: black; background-co
    1 楼 lasttimes 2011-08-24  
    可以尝试在AndroidManifest.xml文件中的启动activity一项中加入参数
    android:launchMode="singleInstance"

    试试。
    2 楼 guoying245 2011-10-20  
    lasttimes 写道
    可以尝试在AndroidManifest.xml文件中的启动activity一项中加入参数
    android:launchMode="singleInstance"

    试试。

    谢谢,管用
    3 楼 anjxue 2011-12-01  
    使用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 已停止运行&quot
    • 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播放不正常


        
    [2] 文件夹权限唤起的MediaPlayer播放不正常
        来源: 互联网  发布时间: 2014-02-18
    文件夹权限引起的MediaPlayer播放不正常
    写了一个Ap,在程序运行时会解压一些声音文件到/data/data/app_dir目录。
    在调用Mediaplayer来播放这些文件时,总是提示失败,在网上搜到有提到权限的问题,把目录改成所有人可读写即可播放,验证后ok。

    分析原因是MediaPlayer是个服务,是在另一个进程也是另一个用户的,默认创建的声音文件对其是不可读的,导致无法读取数据,在MediaPlayer.prepare()时总是失败。

    但是每次修改目录的权限是不现实的,所以可以先把文件打开,然后把文件句柄传给MediaPlayer,这是MediaPlayer就可以通过此句柄获取到数据。

    MediaPlayer.setDataSource((new FileInputStream(new File(soundFilePath))).getFD());

        
    [3] 发一个省电小程序-定时切换飞行模式
        来源: 互联网  发布时间: 2014-02-18
    发一个省电小程序---定时切换飞行模式


      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中读取数据。

     

    下面是程序的运行效果:


     

     

    1 楼 kevinems 2011-06-06  

    招着你的代码抄了一份。。。哈哈,谢谢了。
    2 楼 liucanjie 2011-10-17  
    怎么不是APK文件呀,2.1系统能用吗
    3 楼 liucanjie 2011-10-17  
    很喜欢你写的小软件,自动飞行和小闹钟,能把这两个打包好的APK安装文件发给我邮箱吗
    我的邮箱13973061177@139.com
    谢谢
    4 楼 aswang 2011-10-17  
    liucanjie 写道
    很喜欢你写的小软件,自动飞行和小闹钟,能把这两个打包好的APK安装文件发给我邮箱吗
    我的邮箱13973061177@139.com
    谢谢


    很早以前写的了!
    你直接下载这个zip文件,解压之后,里面包含源代码以及apk安装包。
    其中apk安装包在bin目录里面。

    你也可以把源代码导入eclipse,自己加以修改或者美化。

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3