Java 在启动时启动服务,并从BR的onReceive方法启动活动
首先,我不想说我试图在stackoverflow上找到答案,但没有成功。其次,我在三星S34G 4.1.2上测试了我的代码 我对我编写的代码有一些疑问 ---解释:Java 在启动时启动服务,并从BR的onReceive方法启动活动,java,android,service,broadcastreceiver,boot,Java,Android,Service,Broadcastreceiver,Boot,首先,我不想说我试图在stackoverflow上找到答案,但没有成功。其次,我在三星S34G 4.1.2上测试了我的代码 我对我编写的代码有一些疑问 ---解释: 代码在BOOT_完成时启动ClsAutoStart,启动服务SvcFirst,该服务注册一个与NEW_OUTGOING_CALL动作同步的BroadcastReceiver。在onReceive()方法中,我启动活动 您知道,活动应该在调用时弹出(还没有条件) ---问题: 这是可行的,但我没有准确的预期行为,因此我有一些问题: 1
代码在BOOT_完成时启动ClsAutoStart,启动服务SvcFirst,该服务注册一个与NEW_OUTGOING_CALL动作同步的BroadcastReceiver。在onReceive()方法中,我启动活动 您知道,活动应该在调用时弹出(还没有条件) ---问题:
这是可行的,但我没有准确的预期行为,因此我有一些问题: 1-只有在安装后和重新启动前首先打开“活动”,一切才能顺利进行。然后,在那之后,每段代码都会做它必须做的事情。有人能解释一下为什么我必须启动活动才能让它工作吗?如何避免呢 2-我之所以使用此方法进行操作,是因为我不希望我的应用程序出现在应用程序列表中(对于用户)。我不想使用onReceive方法启动活动。 我试图从清单文件中删除以下几行,但我回到了问题“1”:如果我以前不能启动活动,它就不起作用(因为这些行被删除了,所以不可能启动任何东西) 首先:
谢谢你的帮助 有人能解释一下为什么我必须启动活动才能让它工作吗 因为从Android 3.1开始,当应用程序处于强制停止状态时,清单注册的接收者将无法工作。出现这种情况:
- 第一次安装时
- 用户点击设置中的“强制停止”按钮后
<category android:name="android.intent.category.HOME" />
很少与接收者一起使用。HOME
类别与活动一起使用,并指定主屏幕实现。@front:“有没有办法在清单文件之外注册接收者(启动完成)?--不太可能。但是您可以调用registerReceiver()
在某个正在运行的组件中,当该组件能够发出该调用时,引导将早已过去。“在我的情况下,在第一次安装时,我无法运行任何东西,因为没有任何东西可以运行“--那么你需要解决这个问题。此外,您需要让用户能够控制您的应用程序的行为、访问文档、许可协议副本、支持链接等。我无意中抑制了以前的评论。谢谢你的回答。你说我必须解决这个问题。我理解你,但在这里我不希望我的应用程序启动感谢图标,但感谢一个特殊的事件(例如一个电话)。有什么好办法吗?我知道你很精确,但我需要你更精确一些。@front:“有没有一个好的方法可以做到这一点?”——这不是为了避免需要一些东西来显式地启动你的应用程序,使其脱离强制停止状态。例如,您可以使用GCM发送推送消息,或监视SMS消息,或其他任何消息。但是,与BOOT_COMPLETED
一样,当你的应用程序处于强制停止状态时,所有这些都不会起作用。我知道我必须退出强制停止状态。我也明白,我可以发送短信或任何东西来摆脱那种状态。但是,如果之前没有执行任何代码(接收方),那么什么会收到此事件(sms或其他)?当我创建一个只有一个类(在启动时调用)启动服务的项目时,我没有任何启动图标。我明白为什么(没有活动)。它起作用了(服务终于启动了)。我想我可以在我的项目中添加一个活动,该活动可以通过一些代码启动。@front:“我也知道我可以发送短信或其他任何东西来摆脱那种状态”——唯一能让你摆脱那种状态的是一个明确的意图
(即,其中包含你的组件名
)。SMS接收器不合格。其他人通过明确的Intent
启动应用程序的最常见场景是启动程序启动您的launcher
活动。欢迎您尝试查找其他内容,但是,正如我指出的,出于其他原因,您仍然需要一个启动器
活动。
<category android:name="android.intent.category.HOME" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.frontal.invisible04"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.frontal.invisible04.ActMain"
android:label="@string/title_activity_act_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.frontal.invisible04.SvcFirst">
</service>
<receiver
android:name="com.frontal.invisible04.ClsAutoStart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!--<category android:name="android.intent.category.HOME" />-->
</intent-filter>
</receiver>
</application>
</manifest>
public class ClsAutoStart extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if ((intent.getAction() != null) && (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")))
{
context.startService(new Intent(context, SvcFirst.class));
}
}
}
public class SvcFirst extends Service
{
Context context;
private BroadcastReceiver br_interface;
private static final String ACTION_SHOWACT = "android.intent.action.NEW_OUTGOING_CALL";
@Override
public void onCreate()
{
super.onCreate();
this.context = getApplicationContext();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
final IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_SHOWACT);
this.br_interface = new SecretInterfaceBR();
this.registerReceiver(this.br_interface, filter);
return (START_STICKY);
}
public class SecretInterfaceBR extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent intent1 = new Intent(context, ActMain.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
context.startActivity(intent1);
}
}
@Override
public IBinder onBind(Intent intent)
{
return (null);
}
public void onDestroy()
{
this.unregisterReceiver(this.br_interface);
}
}