apm*_*987 66 boot android broadcastreceiver
我在这里寻找类似的问题,但由于某种原因,我的BroadcastReceiver永远不会收到android.intent.action.BOOT_COMPLETED Intent.
这是我的(相对)Android.Manifest文件:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<receiver android:name=".BootReceiver"
android:enabled="true"
android:exported="true"
android:label="BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这是实际的接收器.
public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";
@Override public void onReceive(Context context,Intent intent){
try{
context.startService(new Intent(context,ConnectivityListener.class));
Log.i(TAG,"Starting Service ConnectivityListener");
}catch(Exception e){
Log.e(TAG,e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!任何帮助是极大的赞赏
fkl*_*pan 163
您可以通过adb连接到设备并打开设备shell来模拟所有广播操作.
开始了:
adb shell或在linux/mac上./adb shellam broadcast -a android.intent.action.BOOT_COMPLETED或您想要触发的任何操作中adb或adb shell附带了许多不错的命令.就试一试吧
关心弗洛
编辑:哦该死的,我想把这个答案作为"每次必须打开/关闭电话"的答案.对不起大家
Can*_*ner 144
我发布这个是希望它对那些已经尝试了所有东西但仍然无法让它在安装后在启动时运行或以前曾经工作并且不再工作的人会有所帮助.
假设您已添加权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)
并注册您的接收器:
<receiver android:name="com.example.startuptest.StartUpBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
编码你的BroadcastReceiver:
public class StartUpBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
从Android 3.1开始,所有应用程序在安装时都处于" 停止 "状态.(这与用户从"设置"应用程序强制停止应用程序后应用程序结束的状态相同.)

处于"已停止"状态时,除了手动启动活动外,应用程序不会以任何理由运行.(意味着没有BroadcastRecevier(ACTION_PACKAGE_INSTALLED,BOOT_COMPLETED等等将被调用的而不考虑他们所登录的事件,直到用户手动运行该应用.)
这是Google为防止恶意软件应用而做出的设计决定.谷歌一直主张用户应该先从启动器启动一个活动,然后该应用程序可以做很多事情.防止BOOT_COMPLETED在活动启动之前交付是该论点的合理结果.
一旦用户在您的应用中运行一次任何活动,您将在所有未来的启动后收到BOOT_COMPLETED广播.
有关此内容的更多详细信息:http:
//developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http ://devmaze.wordpress.com/2011/12/05/activating-applications/
Sun*_*501 55
如果您的应用程序安装在外部存储(SD卡)上,您将永远不会收到启动完成操作.所以,你必须指定android:installLocation="internalOnly"的manifest tag.
apm*_*987 11
原来接收器不在清单的标签中.哎呦!谢谢你的帮助!关于测试这个问题的最糟糕的部分是不得不继续关闭和打开手机.:P
这似乎是解决此问题的最前线,因此我想为我的C#同事添加解决方案。在尝试了这里的所有内容后,我绞尽脑汁想弄清楚自己在做什么,但无济于事。我终于弄清楚了什么地方出了问题,这和这里有关C#Mono开发的建议有些不同。基本上,可以归结为我刚刚学到的困难方法。使用C#不要手动修改AndroidManifest.xml!
请参阅此指南以供参考: Xamarin:使用AndroidManifest.xml
对于这个问题,更直接的方法是完成此操作。
首先,在项目属性的“清单”选项卡下,有一个复选框列表,用于选择要提供的权限,其中之一是RECEIVE_BOOT_COMPLETED。检查以提供这些权限。
其次,您需要在BroacastReceiver类上放置适当的标签。
[BroadcastReceiver]
[IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class MyBootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
// Do your boot work here, set alarms, show toasts, whatever
}
}
Run Code Online (Sandbox Code Playgroud)
不需要[IntentFilter()]的最后一部分来处理优先级,它只是让其他更高优先级的东西在启动时首先完成,如果您的应用程序不是高优先级的事情,这是个好习惯。
正如您将在链接的文章中看到的那样,在代码中使用这些标记将导致在构建时以应有的方式创建AndroidManifest.xml文件。我发现的是,当手动修改清单以包括接收者标签时,系统使它在一级上查找的类太深,从而引发了ClassNotFound异常。它试图实例化[Namespace]。[Namespace]。[BroadcastReceiver],这是错误的。之所以这样做,是因为手动进行了清单编辑。
无论如何,希望这会有所帮助。
另外,使用adb工具的另一个快速技巧。如果要获取更易于阅读的日志版本,请尝试以下操作:
C:\ Android \ platform-tools \ adb logcat >> C:\ log.txt
这会将logcat转储到一个文本文件中,您可以打开该文本文件,并且比在命令提示符窗口中阅读还容易一些。使事物的剪切和粘贴也更加容易。
| 归档时间: |
|
| 查看次数: |
89589 次 |
| 最近记录: |