简体   繁体   English

使用配置活动从小部件启动活动

[英]Launching an activity from a widget with a configure activity

Hi Everyone, I am having a problem with launching an activity from my home screen widget.And before some one marked this as a duplicate questions , please know that I have looked around and tried the solutions mentioned in other similar questions.Especially this one Launching activity from widget 大家好,我有从我的主屏幕发起一项活动widget.And之前有人标志着这是一个重复的问题问题,请知道我环顾四周,试图在其他类似questions.Especially这一项中提到的解决方案下水小部件中的活动

My problem is simple enough , I want to launch an activity from my home screen widget , and it is not working. 我的问题很简单,我想从主屏幕小部件启动一个活动,但它不起作用。 Note : The Activity launches from the widget once(for the first time) after a fresh install of the application. 注意:全新安装应用程序后,活动会从小部件启动一次(第一次)。

Here is the code for the widget provide, the configure activity and the relevant manifest entry.let me know if you need to see any more bits of code. 这是小部件提供的代码,configure活动和相关的清单条目。如果您需要查看更多代码,请告诉我。

the configure activity: 配置活动:

    public class SingleNoteConfigure extends ListActivity  {


private NotesDbAdapter mDbHelper;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
public static String ACTION_WIDGET_LIST = "ActionReceiverList";
public static String ACTION_WIDGET_NEW = "ActionReceiverNew";



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //set the result to canceled to allow the user
    //to change their mind mid widget configure
    setResult(RESULT_CANCELED);
    Log.d("MYTAG", "in the onCreate of of the widget configure");

    //set the layout file for the widget configure
    setContentView(R.layout.notes_list_config);

    //using the action bar title for user instruction
    setTitle("Select note to display on the widget");

    // Find the widget id from the intent. 
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        mAppWidgetId = extras.getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }
    Log.d("MYTAG", "in the onCreate");
    //stuff to get the database to open
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();

    //call the method that fills the list view
    fillData();

}

 @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Cursor note = mDbHelper.fetchNote(id);
        startManagingCursor(note);
        String title = note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE));
        String text = note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY));



        RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.singlenote_widget);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
        appWidgetManager.updateAppWidget(mAppWidgetId, views);    



        Log.d("MYTAG", "in the onListItemClick....");

        loadData(title, text, id);//here id is the row id of the selection;it is returned by the onListItemSelect 

        Intent resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);            
        setResult(RESULT_OK,resultValue);   
        finish();
 }



 void loadData(String title, String text, Long Id) {

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    Log.d("MYTAG", "in the load data....");
    SingleNote.updateWidget(this, appWidgetManager, mAppWidgetId, title, text);
    NotesDbAdapter.updateWidgetId(mAppWidgetId,Id);

}

private void fillData() {
    Cursor notesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(notesCursor);
    Log.d("MYTAG", "in the fill data  of the widget configure");
    // Create an array to specify the fields we want to display in the list (TITLE and DATE)
    String[] from = new String[]{NotesDbAdapter.KEY_TITLE,NotesDbAdapter.KEY_DATE};


    // and an array of the fields we want to bind those fields to (title and date)
    int[] to = new int[]{R.id.title,R.id.date};


    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row1, notesCursor, from, to);

    setListAdapter(notes);


}  
}

The widget provider: 窗口小部件提供程序:

 public class SingleNote extends AppWidgetProvider {

public static String UPDATE_ACTION = "ActionUpdateSinglenoteWidget";

private static NotesDbAdapter mDbHelper;



public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];            

        Log.d("MYTAG", "in the onUpdate");

        Intent intent = new Intent(context, Notepadv3.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.singlenote_widget);
        views.setOnClickPendingIntent(R.id.single_note_text, pendingIntent);  

        // Push update for this widget to the home screen

        ComponentName thisWidget = new ComponentName(context, SingleNote.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(thisWidget, views);

    }
}

@Override 
public void onReceive(Context context, Intent intent) { 

    try
    {

    Log.d("MYTAG", "in the onReceive....");
        String action = intent.getAction(); 
        Log.d("MYTAG", "in the onReceive....line 2");
        Bundle extras = intent.getExtras(); 
        Log.d("MYTAG", "in the onReceive....after bundle");
        String title = extras.getString("title");
        Log.d("MYTAG", "in the onReceive....after title");
        String text = extras.getString("body");
        Log.d("MYTAG", "in the onReceive....after text");
        Log.d("MYTAG", "@ the point of int");
        int id = extras.getInt("widget_id");

        Log.d("MYTAG", action+ title + text + id);

        if (action != "rakshak" && action.equals(UPDATE_ACTION)) { 
            final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

            if (id > 0)
            {
                updateWidget(context, appWidgetManager, id ,title ,text);
            }
            else {
                return;

            }
        }
        else { 
            super.onReceive(context, intent); 
        } 

    }
    catch (Exception e)
    {
        Log.e("STACKTRACE_TAG", "STACKTRACE");
        Log.e("STACKTRACE_TAG", Log.getStackTraceString(e));
    }


}

static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, String title, String text){

    Log.d("MYTAG", "in the updatewidget method in the siglenote widget....");
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.singlenote_widget);
    views.setTextViewText(R.id.single_note_title, title);
    views.setTextViewText(R.id.single_note_text, text);
    appWidgetManager.updateAppWidget(appWidgetId, views);



}
    }

The stuff from the android manifest: android清单中的内容:

  <receiver android:name=".SingleNote" 
                android:label="Y.A.N (single note widget)"
                android:enabled="@bool/is_GB">
        <intent-filter> 
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" 
                   android:resource="@xml/singlenote_widget_provider" />
      </receiver>  

Here are my 2 main questions: 这是我的两个主要问题:

  1. how do I get the activity to launch 我如何启动活动
  2. And how do I get the widget Id of the widget that is being taped? 以及如何获取要录音的小部件的小部件ID?

Thanks for taking the time to read this and for any help that you can give. 感谢您抽出宝贵的时间阅读本文档以及您可以提供的任何帮助。

I don't see your activity listed in the manifest, but you didn't paste the whole file. 我没有在清单中看到您的活动,但是您没有粘贴整个文件。 Make sure the activity exists there. 确保活动在那里。

Here is a working snippet of the pending intent that I use in many of my widgets to launch activities: 这是我在许多小部件中用于启动活动的未决意图的有效片段:

Intent configIntent = new Intent(context, ActivityToBeLaunched.class);
        configIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // Make the pending intent unique...
        configIntent.setData(Uri.parse(configIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.widgetBack, pendIntent);
    }

One other thing; 另一件事; I don't see a return views; 我看不到return views; anywhere. 任何地方。 Are you handling that elsewhere? 您在其他地方处理吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM