Не удается запустить ActivityManager.RunningTaskInfo.topActivity из приложения Android AppWidgetProvider - PullRequest
0 голосов
/ 26 октября 2011

У меня есть метод onUpdate (...) класса MyAppWidgetProvider с кодом:

...
Intent launchAppIntent = new Intent(context, SearchActivity.class);        
PendingIntent launchAppPendingIntent = PendingIntent.getActivity(context, 0, launchAppIntent, 0);        
remoteView.setOnClickPendingIntent(R.id.logo, launchAppPendingIntent);  
...

Работает нормально. Новая SearchActivity начинается с нажатия на виджет. Теперь я хочу начать по щелчку не SearchActivity, а действие с вершины стека моей задачи. Для этого я изменяю приведенный выше код на:

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(30);        
for (ActivityManager.RunningTaskInfo task:tasks) {
    if (task.baseActivity.getShortClassName().equals(".MainActivity")) {    
        try {
            Intent launchAppIntent = new Intent(context, Class.forName(task.topActivity.getClassName()));
            PendingIntent launchAppPendingIntent = PendingIntent.getActivity(context, 0, launchAppIntent, 0);        
            remoteView.setOnClickPendingIntent(R.id.logo, launchAppPendingIntent);                     
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(CashWidgetProvider.class.getName()).log(Level.SEVERE, null, ex);
        }                  
    }
}

это не работает. Активность переднего плана в стеке задач не отображается на мониторе. Более того, я не получаю никаких сообщений в журнале с этим кодом.

Тем не менее, тот же код прекрасно работает, будучи помещенным в некоторый метод класса, унаследованный от Activity.

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(30);        
for (ActivityManager.RunningTaskInfo task:tasks) {
    System.out.println(task.baseActivity.getShortClassName());
    if (task.baseActivity.getShortClassName().equals(".MainActivity")) {
        try {
            Intent launchAppIntent = new Intent(this, Class.forName(task.topActivity.getClassName())); 
            startActivity(launchAppIntent);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(AbstractActivity.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
} 

Как мне заставить его работать на AppWidget!?

1 Ответ

1 голос
/ 27 октября 2011

Проблема возникает из-за неправильного понимания жизненного цикла виджета, как обычно ... Чтобы он заработал, мне нужно создать класс MyService, унаследованный от Service, переопределяя метод onStart с кодом:

...
Context context = this.getApplicationContext();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(30);        
for (ActivityManager.RunningTaskInfo task:tasks) {
    if (task.baseActivity.getShortClassName().equals(".MainActivity")) {    
        try {
            Intent launchTopIntent = new Intent(context, Class.forName(task.topActivity.getClassName()));
                context.startActivity(launchTopIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));             
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(CashWidgetProvider.class.getName()).log(Level.SEVERE, null, ex);
        }                  
    }
} 
...

и вызовите выше MyService из класса AppWidgetProvider с помощью кода:

Intent launchAppIntent = new Intent(context, MyService.class);
launchAppIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent launchAppPendingIntent = PendingIntent.getService(
            context.getApplicationContext(), 0, launchAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.logo, launchAppPendingIntent2); 

Не забудьте добавить этот новый сервис в AndroidManifest.xml в разделе

<application>
    ...
    <service android:name=".MyService"/>
</application>

P.S. Возможно, было бы лучше использовать BroadcastReceiver вместо Service.

...