Launching activity from widget

后端 未结 9 1159
深忆病人
深忆病人 2020-11-29 00:26

I\'m trying to do something which really ought to be quite easy, but it\'s driving me crazy. I\'m trying to launch an activity when a home screen widget is pressed, such as

相关标签:
9条回答
  • 2020-11-29 00:52

    I was having the same issue. I discovered that the fix is to call an update through the appwidget manager. here is an example of how to do that in onEnabled. It appears it needs to be done in both onEnabled and onUpdated so that when device is powering on your click intent is also intialized - in onUpdated the params already provide the reference to the manager, luckily.

    @Override 
        public void onEnabled(Context context) {  
              //Log.v("toggle_widget","Enabled is being called"); 
    
              AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
              //retrieve a ref to the manager so we can pass a view update 
    
              Intent i = new Intent(); 
              i.setClassName("yourdoman.yourpackage", "yourdomain.yourpackage.yourclass"); 
              PendingIntent myPI = PendingIntent.getService(context, 0, i, 0); 
              //intent to start service 
    
            // Get the layout for the App Widget 
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.togglelayout); 
    
            //attach the click listener for the service start command intent 
            views.setOnClickPendingIntent(R.id.toggleButton, myPI); 
    
            //define the componenet for self 
            ComponentName comp = new ComponentName(context.getPackageName(), ToggleWidget.class.getName()); 
    
            //tell the manager to update all instances of the toggle widget with the click listener 
            mgr.updateAppWidget(comp, views); 
    } 
    
    0 讨论(0)
  • 2020-11-29 00:52

    This worked for me, based on info here, the word widget sample, and the tutorial here

           Intent intent = new Intent(Intent.ACTION_MAIN, null);
          intent.addCategory(Intent.CATEGORY_LAUNCHER);
          // first param is app package name, second is package.class of the main activity
          ComponentName cn = new ComponentName("com....","com...MainActivity");
          intent.setComponent(cn);
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          PendingIntent myPI = PendingIntent.getActivity(context, 0, intent, 0); 
    
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_word); 
    
    
        views.setOnClickPendingIntent(R.id.widget, myPI); 
    
        AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
        mgr.updateAppWidget(comp, views); 
    
    0 讨论(0)
  • 2020-11-29 00:56

    When adding the widget to the homescreen, Logcat shows the two debugging lines, though not the Toast. (Any ideas why not?)

    Don't try launching Toasts from a BroadcastReceiver.

    Is there a way to test where the fault is?

    Look at LogCat, via adb logcat, DDMS, or the DDMS perspective in Eclipse. You may find warnings about not finding an activity to match the given Intent.

    I do not see any obvious problem. You may want to take a peek at one of my book examples and see if that works for you, and if it gives you any idea of what may be afoot.

    0 讨论(0)
  • 2020-11-29 00:57

    The problem with the Toast not showing is easy, you don't call show(), a mistake I always do too... do

    Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT).show();
    

    instead of

    Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);
    
    0 讨论(0)
  • 2020-11-29 00:58

    One additional point: The Activity that is called from the Widget needs to be declared in the Manifest file. No exception is thrown, just looks like nothing happens...

    0 讨论(0)
  • 2020-11-29 01:04

    Bringing this way back from the dead, but I had a similar problem and I think I finally solved it... like you, I had a PendingIntent that I attached to the RemoteView. Sometimes it would work, and sometimes it would fail. It was driving me crazy.

    What I found from a tooltip on the PendingIntent.getActivty() was:

    Note that the activity will be started outside of the context of an existing activity, so you must use the Intent.FLAG_ACTIVITY_NEW_TASK launch flag in the Intent.

    so, I added:

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    

    No example code I've seen so far does this, but it solved my problem; the Settings activity is now launched reliably.

    The full code that's working well...

    Intent intent = new Intent(context, Settings.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId);  // Identifies the particular widget...
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // Make the pending intent unique...
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
    PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.wwwidget);
    views.setOnClickPendingIntent(R.id.widget, pendIntent);
    appWidgetManager.updateAppWidget(appId,views);
    
    0 讨论(0)
提交回复
热议问题