Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在启动时获取正确的Id小部件_Java_Android_Widget - Fatal编程技术网

Java 在启动时获取正确的Id小部件

Java 在启动时获取正确的Id小部件,java,android,widget,Java,Android,Widget,我使用以下代码: 我的主要活动: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { int idWidget; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(getIntent().ge

我使用以下代码:

我的主要活动:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    int idWidget;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(getIntent().getExtras()!=null){
        idWidget=getIntent().getExtras().getInt("com.example.testwidget.myIntent.IDWidget");

        Toast.makeText(this,"Id widget : "+Integer.toString(idWidget),Toast.LENGTH_LONG).show();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

我的小部件提供商:

public class myWidgetProvider extends AppWidgetProvider {

public void onUpdate(Context contexte, AppWidgetManager gestionnaireWidget, int[] appWidgetIds) {
    final int N = appWidgetIds.length;
    int appWidgetId;
    RemoteViews vue;
    Intent intentPostIt;
    PendingIntent pendingIntentPostIt;

    Toast.makeText(contexte,"Starting updating widgets",Toast.LENGTH_SHORT).show();

    for (int i=0; i<N; i++) {
        appWidgetId = appWidgetIds[i];

        Toast.makeText(contexte,"Id widget : "+Integer.toString(appWidgetId),Toast.LENGTH_LONG).show();

        intentPostIt = new Intent(contexte,MainActivity.class);

        Logger.getLogger(MainActivity.class.getName()).log(Level.INFO,"Intent : "+intentPostIt.toString());

        intentPostIt.setAction("com.example.testwidget.myIntent");
        intentPostIt.putExtra("com.example.testwidget.myIntent.IDWidget",appWidgetId);
        pendingIntentPostIt = PendingIntent.getActivity(contexte,0, intentPostIt,0);

        Logger.getLogger(MainActivity.class.getName()).log(Level.INFO,"Intent extra : "+Integer.toString(intentPostIt.getIntExtra("GL.PostIt.IDWidget",-1)));

        vue=new RemoteViews(contexte.getPackageName(),R.layout.widget_description);
        vue.setOnClickPendingIntent(R.id.widget,pendingIntentPostIt);
        gestionnaireWidget.updateAppWidget(appWidgetId,vue);
    }

    Toast.makeText(contexte,"Ending updating widgets",Toast.LENGTH_SHORT).show();
}
公共类myWidgetProvider扩展了AppWidgetProvider{
public void onUpdate(上下文contexte,AppWidgetManager gestionnaireWidget,int[]appWidgetIds){
final int N=appWidgetIds.length;
int-appWidgetId;
远程视图vue;
意图、意图、目的;
悬挂悬挂悬挂;
Toast.makeText(contexte,“开始更新小部件”,Toast.LENGTH_SHORT.show();

对于(int i=0;i您需要在Pending帐篷中使用如下标志:

    pendingIntentPostIt = PendingIntent.getActivity(contexte,0, intentPostIt,PendingIntent.FLAG_UPDATE_CURRENT);
如果没有该标志,您放置的额外数据将不会更新,因为系统中已经存在相同的PendingEvent,并且系统只返回您创建的第一个PendingEvent,而不更新其数据

仔细阅读以下内容,以充分了解发生这种情况的原因:

从文档:

PendingEvent本身只是对由系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其所属应用程序的进程被终止,PendingEvent本身也将从已授予它的其他进程中保持可用。如果创建应用程序稍后重新检索相同的数据PendingEvent的种类(相同的操作、相同的意图操作、数据、类别和组件以及相同的标志),如果仍然有效,它将接收表示相同令牌的PendingEvent,并因此可以调用cancel()将其删除。 由于这种行为,在检索PendingEvent时,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”方面有所不同内容,希望每次都获得不同的PendingEvent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果您使用两个Intent对象,它们根据Intent.filterEquals是等效的,那么您将为这两个对象获得相同的PendingEvent

…使用“pendingent.FLAG\u UPDATE\u CURRENT”并不是一个解决方案:第一个小部件Id不是两倍,而是第二个小部件Id的两倍!我既不能区分哪个小部件是启动应用程序的来源。但是说到“pendingent”这是一个很好的线索:通过在请求代码中传递小部件Id,我已经能够获得触发小部件的小部件Id。然后我的问题就解决了。