如何在Android中通过小部件上的按钮运行活动?

如何在Android中通过小部件上的按钮运行活动?,android,button,android-activity,widget,Android,Button,Android Activity,Widget,我正在开发一个由按钮组成的切换小部件。按下时,我希望它运行一个活动,而不打开任何东西(只是像往常一样在桌面上说)。有没有一种方法可以通过桌面小部件上的按钮直接运行活动?谢谢 更新:现在我试图在代码中切换静默模式,而不运行新活动。 这是我当前的代码(当我出于某种原因单击按钮时,这些按钮不起任何作用) 在主屏幕小部件上启动活动单击: 方法1:在ononReceive中 Intent intentClick = the new Intent to (context, update, class);

我正在开发一个由按钮组成的切换小部件。按下时,我希望它运行一个活动,而不打开任何东西(只是像往常一样在桌面上说)。有没有一种方法可以通过桌面小部件上的按钮直接运行活动?谢谢 更新:现在我试图在代码中切换静默模式,而不运行新活动。 这是我当前的代码(当我出于某种原因单击按钮时,这些按钮不起任何作用)


在主屏幕小部件上启动活动单击:

方法1:在on
onReceive中

Intent intentClick =   the new Intent to (context, update, class);
PendingIntent pendingIntent = PendingIntent.getActivity (context, 0,
intentClick, 0);
rv.setOnClickPendingIntent (R.id.layout, pendingIntent);
Intent intn = new Intent (context, update. Class);
intn.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity (intn);
方法2:in
onReceive

Intent intentClick =   the new Intent to (context, update, class);
PendingIntent pendingIntent = PendingIntent.getActivity (context, 0,
intentClick, 0);
rv.setOnClickPendingIntent (R.id.layout, pendingIntent);
Intent intn = new Intent (context, update. Class);
intn.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity (intn);

但您必须为widget click注册广播。如果您想在后台做某事,您可以使用服务而不是活动:

1.您可以在应用程序启动或小部件显示后立即启动服务。)

2.单击widge时尝试绑定服务 ,android.content.ServiceConnection,int)

3.绑定后,您可以使用serviceConnection从绑定器获取服务实例。然后可以执行服务中定义的代码。 请参见此处的示例:http://developer.android.com/reference/android/app/Service.html

或者你可以

  • 尝试启动服务(仅在服务实例上随时运行)

  • 向要求服务机构为你做某事的服务机构发送广播


  • 由于活动旨在向用户显示某事物,而服务旨在在后台执行。

    另一种选择是发送广播意图,而不是启动活动!我想在按下小部件按钮时执行一个操作,而不是专门启动一个会显示在屏幕上的活动。您可以使用此技术在小部件本身(小部件不一定包含活动)中执行代码

    使用pendingent.getBroadcast()创建带有“密钥”的pendingent,而不是使用pendingent启动活动:ActivityManager.INTENT\u SENDER\u BROADCAST,这会导致ActivityManager执行sendBroadcast()而不是startActivity()

    您需要在onRecieve()方法中添加一个“if”语句,以截取您使用的一个或多个操作名称:

    public void onReceive(Context ctx, Intent intt) {
      String action = intt.getAction();
      if (action.compareTo("myActionName")) {
        // Do your myActionName work here
      } else {
        super.onReceive(ctx, intt);
      }
    } // end of onReceive
    

    在主屏幕小部件上,单击“是否要启动活动?”是。但我不想让它打开全屏页面或任何东西,只是一个活动。一个活动通常是全屏的,除非你将其主题化为对话主题或类似的内容。我真的只想运行一些代码来切换振铃器模式和蓝牙等。从我所知,它在小部件的代码中不起作用,这就是为什么我倾向于在后台使用活动。@MattDemontous:为什么它不能从小部件代码中工作?如果我的小部件上有工作按钮怎么办。我将如何使用它们实现这一点?请参见我的答案:我如何告诉it具体运行哪个活动?(使用链接到的帖子)在您的情况下,无需启动新活动您只需在ACTION\u WIDGET\u单击接收器并更改振铃器模式时检查振铃器模式。我不知道您为什么要为toggle ringer和wifi WIDGET启动单独的活动,但如果您要启动新活动,则
    Caller2.class
    在用户单击WIDGET时运行。当我测试它时,按钮会运行没有什么。