gpt4 book ai didi

android - 如何获得所有系统包 Intent 的通知——无论我的应用程序是否正在运行,当这些 Intent 被触发时

转载 作者:行者123 更新时间:2023-11-30 04:13:19 25 4
gpt4 key购买 nike

我想要完成的事情:

我正在尝试跟踪所有安装/卸载/更改/替换的应用程序/包。我想注册我的广播接收器来接收所有这些 Intent 并启动服务来做我的事情。我希望无论我的应用程序当前是否处于 Activity 状态,我的广播接收器都会被调用。

我做了什么:

首先,我在 list 文件中为 android.intent.action.PACKAGE_ADDED、REMOVED、CHANGED、REPLACED Intent 注册了 MyBroadcastReceiver。我的接收器没有被调用。通过查看论坛问题,我遇到了这个,建议为这些 Intent 动态注册接收器,我在 MyApplication.onCreate() 重写中这样做了——但仍然没有成功,即使我的应用程序处于 Activity 状态(可能已停止)也是如此。

我要避免的事情:

我不想在每次启动我的应用程序时都使用最丑陋和低效的方法来调用以下代码——只是为了与系统同步:

public List<ResolveInfo> getLaunchable() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
return myContext.getPackageManager().queryIntentActivities(intent, 0);
}

我的问题:

有人可以告诉我我的解决方案中缺少什么吗?这个问题有不同的解决方案吗?

我的 list 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my_name_space" android:versionCode="1" android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">

<receiver
android:name=".MyReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="com.gg.test_action"/>
</intent-filter>
</receiver>

</application>

</manifest>

我的广播接收者:

package com.my_name_space;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// Never make it to here…
Toast.makeText(context, "Got " + intent.getAction(), Toast.LENGTH_LONG);
}
}

在动态注册变体中,我添加了 PackageBrApp:

package com.my_name_space;
import android.app.Application;
import android.content.Intent;
import android.content.IntentFilter;

public class PackageBrApp extends Application {
public MyReceiver myReceiver = null;

@Override
public void onCreate(){
super.onCreate();
myReceiver = new MyReceiver();
registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_PACKAGE_ADDED));
registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_PACKAGE_REMOVED));
registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_PACKAGE_CHANGED));
registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_PACKAGE_REPLACED));
}
}

并相应地修改了 list 文件(删除了接收者声明):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="com.gg" android:versionCode="1" android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
</application>

</manifest>

@@@@ 根据添加 Activity 的建议进行更改@@@@

不幸的是,添加一个 Activity (不仅在安装后和第一次使用广播接收器之前启动它,而且启动它多次)没有帮助。

接收者仍然拒绝唤醒......

这是更新后的接收器代码(更新到一些持久的偏好以消除调试器不会停在那里的可能性)。

package com.my_name_space;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = context.getSharedPreferences("ActivityBr", Context.MODE_PRIVATE);
Editor prefsEditor = prefs.edit();
prefsEditor.putBoolean("receiverInvoked", true);
prefsEditor.apply();
}
}

添加的 Activity :

package com.my_name_space;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.widget.TextView;

public class ActivityBr extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView v = (TextView) findViewById(R.id.text_view);

SharedPreferences prefs = getSharedPreferences("ActivityBr", MODE_PRIVATE);
boolean receiverInvoked = prefs.getBoolean("receiverInvoked", false);
v.setText((receiverInvoked ? "BR invoked" : "BR not invoked"));

Editor prefsEditor = prefs.edit();
prefsEditor.putBoolean("receiverInvoked", false);
prefsEditor.apply();
}
}

list 文件是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my_name_space"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ActivityBr"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="com.gg.test_action"/>
</intent-filter>
</receiver>
</application>

</manifest>

如果有任何不同,main.xml 是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/app_name" />

</LinearLayout>

我猜我被定期轮询更改的丑陋解决方案困住了......

最佳答案

First I registered MyBroadcastReceiver for android.intent.action.PACKAGE_ADDED,REMOVED,CHANGED,REPLACED intents in the manifest file. My receiver was not invoked.

我猜您是在 Android 3.1+ 环境中对此进行测试。如果是这样,您需要在您的应用程序中进行 Activity ,并且用户必须 run that activity manually once在您的 list 注册接收者响应之前。

关于android - 如何获得所有系统包 Intent 的通知——无论我的应用程序是否正在运行,当这些 Intent 被触发时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com