随笔-1  评论-68  文章-98  trackbacks-0

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

日期:2010/12/13

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

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

shell 命令行运行;

Launcher待机界面执行;

状态通知栏运行;

桌面快捷方式运行;

软件中调用运行;

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

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

  1. Intent intent = new Intent(this, TestActivity.class);  
  2. intent.setAction(Intent.ACTION_MAIN);  
  3. intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  4. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  5. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  6. this.startActivity(intent);  
 

 

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

  1. Intent intent = new Intent(this, TestActivity.class);  
  2. this.startActivity(intent);  
 

 

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

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

程序入口MAIN程序:SplashActivity.java

程序原入口程序:LoginActivity.java

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

  1. package org.anymobile.test;  
  2. import android.app.Activity;  
  3. import android.app.Notification;  
  4. import android.app.NotificationManager;  
  5. import android.app.PendingIntent;  
  6. import android.content.ComponentName;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. public class SplashActivity extends Activity  
  11. {  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState)  
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.           
  17.         this.showNotification(this.getBaseContext(), -1"Test is Running!""Test Start Up!");  
  18.           
  19.         Intent intent = this.getIntent();  
  20.         if (intent.hasCategory(Intent.CATEGORY_LAUNCHER))  
  21.         {  
  22.             intent = new Intent(this, TestActivity.class);  
  23.             this.startActivity(intent);  
  24.         }  
  25.         else  
  26.         {  
  27.             intent = new Intent();  
  28.             ComponentName componentName = new ComponentName(this, SplashActivity.class);  
  29.             intent.setComponent(componentName);  
  30. //          intent = new Intent(this, SplashActivity.class);  
  31.               
  32.             intent.setAction(Intent.ACTION_MAIN);  
  33.             intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  34.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  35.             intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  36.               
  37.             this.startActivity(intent);  
  38.         }  
  39.           
  40.         this.finish();  
  41.     }  
  42.     public void showNotification(Context context,int iResIcon,String sNotifybar,String sNofitymsg)  
  43.     {  
  44.         // look up the notification manager service  
  45.         NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);  
  46.         // The details of our fake message  
  47.         CharSequence from = "Test";  
  48.         CharSequence message = sNofitymsg;  
  49.           
  50.         Intent intent = new Intent();  
  51.         ComponentName componentName = new ComponentName(context, TestActivity.class);  
  52.         intent.setComponent(componentName);  
  53.           
  54.         intent.setAction(Intent.ACTION_MAIN);  
  55.         intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  56.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  57.         intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  58.           
  59.         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);  
  60.         Notification notification =   
  61.             new Notification(iResIcon,sNotifybar, System.currentTimeMillis());  
  62.         notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;  
  63.         notification.defaults =   
  64.             /*Notification.DEFAULT_SOUND|*/Notification.DEFAULT_LIGHTS;  
  65.         notification.setLatestEventInfo(context, from, message, contentIntent);  
  66.         nm.notify(R.string.app_name, notification);  
  67.     }  
  68.     @Override  
  69.     protected void onStart()  
  70.     {  
  71.         // TODO Auto-generated method stub  
  72.         super.onStart();  
  73.     }  
  74.     @Override  
  75.     protected void onResume()  
  76.     {  
  77.         // TODO Auto-generated method stub  
  78.         super.onResume();  
  79.     }  
  80.     @Override  
  81.     protected void onStop()  
  82.     {  
  83.         // TODO Auto-generated method stub  
  84.         super.onStop();  
  85.     }  
  86.     @Override  
  87.     protected void onDestroy()  
  88.     {  
  89.         // TODO Auto-generated method stub  
  90.         super.onDestroy();  
  91.     }  
  92. }  
 

 

  1. package org.anymobile.test;  
  2. import android.app.Activity;  
  3. //import android.content.ComponentName;  
  4. import android.content.Intent;  
  5. import android.graphics.LightingColorFilter;  
  6. import android.os.Bundle;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. public class TestActivity extends Activity  
  12. {  
  13.     private static final int ADD_ID = 0;  
  14.     private static final int DEL_ID = 1;  
  15.       
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState)  
  19.     {  
  20.         Intent intent = this.getIntent();  
  21.         if (! intent.hasCategory(Intent.CATEGORY_LAUNCHER))  
  22.         {  
  23.             this.getIntent().addCategory(Intent.CATEGORY_LAUNCHER);  
  24.         }  
  25.         this.getWindow().addFlags(CONTEXT_IGNORE_SECURITY);  
  26.           
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29.           
  30.         Button button = (Button) this.findViewById(R.id.btn_menu);  
  31.         button.setOnClickListener(new OnClickListener()  
  32.         {  
  33.             public void onClick(View v)  
  34.             {  
  35. //              TestActivity.this.openOptionsMenu();  
  36.                   
  37. //              String packName = "com.longcheer.imm";  
  38. //              String className = packName + ".activitys.LoginActivity";  
  39. //                
  40. //              Intent intent = new Intent();  
  41. //              ComponentName componentName = new ComponentName(packName, className);  
  42. //              intent.setComponent(componentName);  
  43. //                
  44. //              intent.setAction("android.intent.action.MAIN");  
  45. //              intent.addCategory("android.intent.category.LAUNCHER");  
  46. //              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  47. //              intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  48. //                
  49. //              TestActivity.this.startActivity(intent);  
  50.                   
  51.                 Intent intent = new Intent(TestActivity.this, Test2Activity.class);  
  52.                 TestActivity.this.startActivity(intent);  
  53.                 TestActivity.this.finish();  
  54.             }  
  55.         });  
  56. //        button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);  
  57.         button.getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF0xFFAA0000));  
  58.     }  
  59.     @Override  
  60.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  61.         // TODO Auto-generated method stub  
  62.         super.onRestoreInstanceState(savedInstanceState);  
  63.     }  
  64.     @Override  
  65.     protected void onSaveInstanceState(Bundle outState) {  
  66.         // TODO Auto-generated method stub  
  67.         super.onSaveInstanceState(outState);  
  68.     }  
  69.     @Override  
  70.     public boolean onCreateOptionsMenu(Menu menu)  
  71.     {  
  72.         menu.add(0, ADD_ID, 0"ADD");  
  73.         menu.add(0, DEL_ID, 0"DEL");  
  74.           
  75.         return super.onCreateOptionsMenu(menu);  
  76.     }  
  77.       
  78.       
  79. }  
 

 

  1. package org.anymobile.test;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.graphics.LightingColorFilter;  
  7. import android.os.Bundle;  
  8. import android.text.ClipboardManager;  
  9. import android.view.Menu;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. public class Test2Activity extends Activity  
  14. {  
  15.     private static final int ADD_ID = 0;  
  16.     private static final int DEL_ID = 1;  
  17.       
  18.     /** Called when the activity is first created. */  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState)  
  21.     {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.           
  25.         ClipboardManager clip = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);  
  26.           
  27.         Button button = (Button) this.findViewById(R.id.btn_menu);  
  28.         button.setText("22222222");  
  29.         button.setOnClickListener(new OnClickListener()  
  30.         {  
  31.             public void onClick(View v)  
  32.             {  
  33.                 Test2Activity.this.openOptionsMenu();  
  34. //              String packName = "com.longcheer.imm";  
  35. //              String className = packName + ".activitys.LoginActivity";  
  36. //                
  37. //              Intent intent = new Intent();  
  38. //              ComponentName componentName = new ComponentName(packName, className);  
  39. //              intent.setComponent(componentName);  
  40. //                
  41. //              intent.setAction("android.intent.action.MAIN");  
  42. //              intent.addCategory("android.intent.category.LAUNCHER");  
  43. //              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  44. //              intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  45. //                
  46. //              Test2Activity.this.startActivity(intent);  
  47.             }  
  48.         });  
  49. //        button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);  
  50.         button.getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF0xFFAA0000));  
  51.     }  
  52.     @Override  
  53.     public boolean onCreateOptionsMenu(Menu menu)  
  54.     {  
  55.         menu.add(0, ADD_ID, 0"ADD2");  
  56.         menu.add(0, DEL_ID, 0"DEL2");  
  57.           
  58.         return super.onCreateOptionsMenu(menu);  
  59.     }  
  60.       
  61.       
  62. }  
 

 

测试流程:

a、软件本地安装;

b、安装后执行“Open”;

c、运行软件会从SplashActivity添加NOTICIFICATION TestActivity;

d、跳转至SplashActivity(附带LAUNCHER ACTION);

e、再跳转至TestActivity;

f、点击BUTTON,跳转至Test2Activity;

g、下拉状态通知栏,点击程序通知,可以正常运行程序。

TODO: 安装软件后执行OPEN后,从待机界面运行程序,还是会启动两个一样的ACTIVITY,这个问题没有解决!:(

posted on 2010-12-14 23:11 Xu Jianxiang 阅读(2044) 评论(2)  编辑  收藏 所属分类: Android

评论:
# re: Android 安装软件后执行“OPEN”引起的Intent血案(系统BUG) 2011-01-07 13:15 | fangbx
您好,你的代码我试验了,不好用,在home还是不行,请求帮助,我的电话是15150657397  回复  更多评论
  
# re: Android 安装软件后执行“OPEN”引起的Intent血案(系统BUG) 2011-01-07 21:59 | Xu Jianxiang
@fangbx
确实,HOME有待解决!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: