在BroadcastReceiver中启动Activity的问题

/**
 * Demo描述:
 * 在BroadcastReceiver中启动Activity的问题
 *
 * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity
 * Intent intent=new Intent(context,AnotherActivity.class);
 * context.startActivity(intent);
 * 可捕获异常信息:
 * android.util.AndroidRuntimeException:
 * Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
 * Is this really what you want?
 * 它说明:在Activity的context(上下文环境)之外调用startActivity()方法时
 * 需要给Intent设置一个flag:FLAG_ACTIVITY_NEW_TASK
 *
 * 所以在BroadcastReceiver的onReceive()方法中启动Activity应写为:
 * Intent intent=new Intent(context,AnotherActivity.class);
 * intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 * context.startActivity(intent);
 *
 *
 * 之前描述了问题的现象和解决办法,现在试着解释一下原因:
 * 1 在普通情况下,必须要有前一个Activity的Context,才能启动后一个Activity
 * 2 但是在BroadcastReceiver里面是没有Activity的Context的
 * 3 对于startActivity()方法,源码中有这么一段描述:
 *   Note that if this method is being called from outside of an
 *   {@link android.app.Activity} Context, then the Intent must include
 *   the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag.  This is because,
 *   without being started from an existing Activity, there is no existing
 *   task in which to place the new activity and thus it needs to be placed
 *   in its own separate task.
 *   说白了就是如果不加这个flag就没有一个Task来存放新启动的Activity.
 *
 * 4 其实该flag和设置Activity的LaunchMode为SingleTask的效果是一样的
 *
 *
 * 如有更加深入的理解,请指点,多谢
 *
 */
时间: 2024-10-27 02:22:51

在BroadcastReceiver中启动Activity的问题的相关文章

java-不能从另外一个 package 中启动 activity 吗?

问题描述 不能从另外一个 package 中启动 activity 吗? 当我在程序中点击按钮时,我想从另外一个 package 中启动一个 activity.Intent代码: final Intent myIntent = new Intent(getApplicationContext() com.facebook.android.Places.class) manifest: <activity android:name="".com.facebook.android.P

源码-android在service中启动Activity问题

问题描述 android在service中启动Activity问题 问什么我在service中启动activity,新的activity闪了一下就被原来的覆盖了?附源码: 这段代码在service中,想弹出"激活设备管理器"页面的功能 Intent in = new Intent(); in.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

broadcastreceiver-没有Activity的BroadcastReceiver怎样启动?

问题描述 没有Activity的BroadcastReceiver怎样启动? 我做了一个简单BroadcastReceiver的demo,已经在配置文件中注册了这个Receiver, 但安装在真机(版本4.2)上,该Receiver没有启动,除非加入了Activity,才会启动, 那如果没有activity,该怎样启动呢? 解决方案 http://zhidao.baidu.com/question/304813029036489364.html?fr=iks&word=%C3%BB%D3%D0A

android如何在activity 中启动和创建一个widget?

问题描述 如题android如何在activity 中启动和创建一个widget? 问题补充:飞雪无情 写道 解决方案 要是在activity创建一个桌面上的widget的话 我试过是不行的.但是可以实现widget里创建一个activity.解决方案二:dialog也是一种widget,都差不多的.按你说的这个意思就是编程的方式了,不用xml 布局文件,你可以这样写public class HelloAndroid extends Activity { /** Called when the

applicationInfo中如何获取应用程序启动Activity的name

问题描述 applicationInfo中如何获取应用程序启动Activity的name private static void getAppInfo(ApplicationInfo applicationInfo) { String packageName = applicationInfo.packageName;// 包名 String activityName = applicationInfo.name; // 获得该应用程序的启动Activity的name String appLab

短信拦截-android BroadcastReceiver中拦截短信后如何给回调activity

问题描述 android BroadcastReceiver中拦截短信后如何给回调activity (4.3之前的)应该是调用接口,但具体的回调接口不清楚,也不清楚如何自动刷新 解决方案 Android-拦截短信(BroadcastReceiver)Android手机短信拦截---BroadcastReceiver(一) 解决方案二: // 注册接收.监听短信receiver smsReceiver = new SMSReceiver(); IntentFilter receiverFilter

android-Android 如何在适配器中启动intent跳转activity

问题描述 Android 如何在适配器中启动intent跳转activity 如题 如何在适配器中启动intent跳转activity 解决方案 你在适配器中传入context就可以了. public class ProductListAdapter extends BaseAdapter { private Context context; private List<String> listData; private ViewHolderProduct viewHolderProduct;

android-如何从一个 activity 中启动另外一个 activity

问题描述 如何从一个 activity 中启动另外一个 activity 我在 main 方法中运行一个 activity ,我想实现如果点击按钮,就会关闭这个用户界面,并跳到其它用户界面来执行其它的事务.这里的另外一个 activity 的名是 renderman. 如何实现? in onClick ( view temp) switch( temp . getId () ) { case R.id.button_validate: 解决方案 public void onClick(View

android中的activity的启动方式有哪几种

问题描述 android中的activity的启动方式有哪几种 android中的activity的启动方式有哪几种 android中的activity的启动方式有哪几种 解决方案 一共有4种: (1)Standard (2)SingleTop (3)SingleTask (4)SingleInstance 在配置文件中对相应的Activity的标签LaunchMode进行修改就可以了. 解决方案二: 4种: standard --> 默认配置,每创建一个activity都会创建一个实例放入 s