запуск активности из сервиса при нажатии на уведомление - PullRequest
6 голосов
/ 02 ноября 2011

Я знаю, здесь есть множество таких вещей, но я пробовал решения целый день и нигде не получил.Ни пример из документации Google, ни какой-либо из 5 других способов, которые я нашел здесь, не сработали для меня вообще.Как и в типичном случае, когда я нажимаю на уведомление, оно закрывает строку состояния, и на экране ничего нового не отображается.Я создаю уведомление от службы и нуждаюсь в уведомлении, чтобы вызвать новое действие, которое еще не было создано.Мне также понадобится способ передать информацию об этом действии через намерение.

И да ... это Java для Android

Ниже приведены разбитые остатки моего кода.

package com.bobbb.hwk2;

import java.io.FileOutputStream;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.widget.Toast;

public class contactBackup extends Service
{
    private NotificationManager nManager;
    private static final int NOTIFY_ID = 1100;

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

        String ns = Context.NOTIFICATION_SERVICE;
        nManager = (NotificationManager)getSystemService(ns);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        // inform user that service has started
        Toast.makeText(getApplicationContext(), R.string.service_started,Toast.LENGTH_LONG).show();

        String data = lookUpContacts();
        if( saveToSDCard(getResources().getString(R.string.backup_file_name),data) )
        {
            Context context = getApplicationContext();

            // create the statusbar notification
            Intent nIntent = new Intent(this,contactViewer.class);//Intent nIntent = new Intent(Intent.ACTION_MAIN);
            nIntent.setClass(context,contactViewer.class);
            //nIntent.putExtra("data",data);


            Notification msg = new Notification(R.drawable.icon,"All contacts records have been written to the file.",System.currentTimeMillis());
            // start notification
            //PendingIntent pIntent = PendingIntent.getService(getApplicationContext(),0,nIntent,PendingIntent.FLAG_UPDATE_CURRENT|Intent.FLAG_FROM_BACKGROUND);
            PendingIntent pIntent = PendingIntent.getActivity(this,0,nIntent,0);
            msg.flags = Notification.FLAG_AUTO_CANCEL;
            msg.setLatestEventInfo(context,
                                   "success",
                                   "All contacts records have been written to the file.",
                                   pIntent);
            nManager.notify(NOTIFY_ID,msg);


        }



    }

    @Override
    public void onDestroy()
    {
        nManager.cancel(NOTIFY_ID);
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }

    // function returns string containing information
    // from contacts
    public String lookUpContacts()
    {
        ...
    }

    public boolean saveToSDCard(String fileName, String data)
    {
        ...
    }

}

Я могу только надеяться, что что-то, что вызывает мою проблему, является чем-то решаемым, и не больше сумасшедших глюков, которые я получал с затмением (которого никто, кажется, еще никогда не видел>: U)

Если вы можете помочь мне решить эту проблему, пожалуйста, поделитесь.Если вы не можете помочь с этой конкретной проблемой, но чувствуете себя обязанным говорить несвязанные вещи о публикации, стилях, темах или хорошей практике, тогда НЕ делайте

Спасибо: D

Ответы [ 3 ]

6 голосов
/ 02 ноября 2011

Изменить:

Вам нужно будет добавить флаг для FLAG_ACTIVITY_NEW_TASK:

nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Это потому, что вы запускаете приложение снаружи (из панели уведомлений системы).

0 голосов
/ 14 марта 2014

Просто добавьте следующее в contactBackup (класс обслуживания),

   Intent nIntent = new Intent(this,contactViewer.class);//Intent nIntent = new Intent(Intent.ACTION_MAIN);
        nIntent.setClass(context,contactViewer.class);
         nIntent.putExtra("data",data);

  nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Notification msg = new Notification(R.drawable.icon,"All contacts records have been written to the file.",System.currentTimeMillis());
        // start notification
        //PendingIntent pIntent = PendingIntent.getService(getApplicationContext(),0,nIntent,PendingIntent.FLAG_UPDATE_CURRENT|Intent.FLAG_FROM_BACKGROUND);
        PendingIntent pIntent = PendingIntent.getActivity(this,0,nIntent,0);
        msg.flags = Notification.FLAG_AUTO_CANCEL;
        msg.setLatestEventInfo(context,
                               "success",
                               "All contacts records have been written to the file.",
                               pIntent);
        nManager.notify(NOTIFY_ID,msg);

затем получить значение в классе contactViewer,

, как,

String s=getIntent().getStringExtra("data");
0 голосов
/ 03 ноября 2011

Вот что происходит, когда люди переутомляются.XD Единственная причина, по которой не надоедало ни одно учебное пособие, которое я устал, заключается в том, что я неправильно написал название своей деятельности в манифесте.Спасибо, что зашли на

...