【问题标题】:Instantiate non-activity class on pending intent in android在android中实例化未决意图的非活动类
【发布时间】:2014-05-10 14:04:10
【问题描述】:

我在 android 中有一个通知,我想做类似的事情

MyStaticClass.start() 当我点击通知时,这个类不是一个活动,它只是实例化一个需要的类。

我该怎么做呢?

这是我的实际代码:

String notificationContent = "Hay una nueva version disponible";
        String notificationTitle = "Firext";
        Bitmap largeIcon = BitmapFactory.decodeResource(FirextApplication.getInstance().getResources(), R.drawable.ic_launcher);
        int smalIcon = R.drawable.ic_launcher;

        Intent intent = new Intent(FirextApplication.getInstance(), UpdateProcess.class);
        intent.setData(Uri.parse("content://" + Calendar.getInstance().getTimeInMillis()));
        PendingIntent pendingIntent = PendingIntent.getActivity(FirextApplication.getInstance(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

        NotificationManager notificationManager = (NotificationManager) FirextApplication.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                FirextApplication.getInstance())
                .setWhen(Calendar.getInstance().getTimeInMillis())
                .setContentText(notificationContent)
                .setContentTitle(notificationTitle)
                .setSmallIcon(smalIcon)
                .setAutoCancel(true)
                .setTicker(notificationTitle)
                .setLargeIcon(largeIcon)
                .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND)
                .setContentIntent(pendingIntent);

        Notification notification = notificationBuilder.build();
        notificationManager.notify((int) Calendar.getInstance().getTimeInMillis(), notification);

还有我需要调用的类

public class UpdateProcess {

    private static final String APPLICATION_VND_ANDROID_PACKAGE_ARCHIVE = "application/vnd.android.package-archive";
    private static final String NEWVERSION = "NewVersion.apk";
    private static final File EX = Environment.getExternalStorageDirectory();

    private static volatile UpdateProcess instance = null;
    private Activity activity;


    private UpdateProcess(Activity activity) {
        this.activity = activity;
        checkForNewUpdates();
    }

    public static void startUpdate(Activity activity) {
        if (instance == null) {
            synchronized (UpdateProcess.class) {
                if (instance == null) {
                    instance = new UpdateProcess(activity);
                }
            }
        } else {
            UpdateProcess.instance.activity = activity;
        }
    }

我只需要做一个 UpdateProcess.startUpdate();

编辑:

这是我的新代码:

private void showNot() {
        String notificationContent = "Hay una nueva version disponible";
        String notificationTitle = "Firext";
        Bitmap largeIcon = BitmapFactory.decodeResource(FirextApplication.getInstance().getResources(), R.drawable.ic_launcher);
        int smalIcon = R.drawable.ic_launcher;

        Intent intent = new Intent(FirextApplication.getInstance(), UpdateProcess.class);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        Notification notificationBuilder = new NotificationCompat.Builder(context)
                .setWhen(Calendar.getInstance().getTimeInMillis())
                .setContentText(notificationContent)
                .setContentTitle(notificationTitle)
                .setSmallIcon(smalIcon)
                .setTicker(notificationTitle)
                .setLargeIcon(largeIcon)
                .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND)
                //.setContentIntent(pendingIntent)
                .addAction(android.R.drawable.arrow_up_float, "Call", pendingIntent).build();


        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder);
    }

public class UpdateProcess extends IntentService {

    private static final String APPLICATION_VND_ANDROID_PACKAGE_ARCHIVE = "application/vnd.android.package-archive";
    private static final String NEWVERSION = "NewVersion.apk";
    private static final File EX = Environment.getExternalStorageDirectory();

    private static volatile UpdateProcess instance = null;
    private Context context;

    private UpdateProcess(Context context) {
        super("UpdateProcess");
        this.context = context;
        checkForNewUpdates();
    }

  @Override
    protected void onHandleIntent(Intent intent) {
        startUpdate(getApplicationContext());
    }

但是当我点击动作时什么都没有发生..我得到这个错误:

05-10 17:15:22.955 753-7617/? W/ActivityManager:无法启动服务 Intent { flg=0x10000000 cmp=com.firext.android/.util.UpdateProcess bnds=[192,346][1080,490] } U=0:未找到

编辑 2. 现在可以了,我忘记在清单中包含服务

【问题讨论】:

  • 不要不要在静态数据成员中放置Activity。您正在泄漏内存。
  • 我需要在 UpdateProcess 内部的方法中显示一个 toast 消息,我应该使用什么?只有上下文,应用上下文,基本上下文..?我不确定。

标签: java android


【解决方案1】:

我需要在 UpdateProcess 内的方法中显示一个 toast 消息,我应该使用什么?

您的Notification 可以通过其PendingIntent 触发ActivityServiceBroadcastReceiverActivityContextServiceContextBroadcastReceiver 接收Context 作为onReceive() 的参数。因此,在所有三个位置中,您已经有一个 Context,所以使用那个。

您也可以考虑完全删除ToastToast 仅适用于用户不需要的消息,因为用户可能看不到它。

我只需要做一个 UpdateProcess.startUpdate();

看来checkForNewUpdates() 会做一些重要的工作。

如果这项工作需要不到 15 秒的时间,请将 UpdateProcess 转换为 UpdateIntentService,扩展 IntentService,然后在 onHandleIntent() 中执行您的 checkForNewUpdates() 工作。您可以使用getService() PendingIntent 来触发UpdateIntentService 来完成它的工作。

如果工作可能需要更长的时间,您应该考虑使用the WakefulBroadcastReceiver pattern(或者可能是my WakefulIntentService),以确保设备保持唤醒状态的时间足以让您完成工作。

【讨论】:

  • 我会将我的课程更新为 IntentService 并删除活动字段,谢谢!
  • @colymore:你注释掉了你对PendingIntent的使用。
  • 有了这个没有 // 它的结果相同..不要开始..我添加了一个带有未决意图的动作,但任何人都可以工作
  • @colymore:查看 LogCat 是否有投诉,例如缺少 <service> 元素。
【解决方案2】:

而不是使用 getActivity() 在您未决的意图中使用 getService()。创建一个临时意图服务以在 onHandleIntent() 中调用 UpdateProcess.startUpdate()。在这种情况下,您当然不能将活动用作参数,但也许您可以在 Context 中更改参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多