Java 在启动时启动服务,并从BR的onReceive方法启动活动

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

首先,我不想说我试图在stackoverflow上找到答案,但没有成功。其次,我在三星S34G 4.1.2上测试了我的代码

我对我编写的代码有一些疑问

---解释:
代码在BOOT_完成时启动ClsAutoStart,启动服务SvcFirst,该服务注册一个与NEW_OUTGOING_CALL动作同步的BroadcastReceiver。在onReceive()方法中,我启动活动

您知道,活动应该在调用时弹出(还没有条件)

---问题:
这是可行的,但我没有准确的预期行为,因此我有一些问题:

1-只有在安装后和重新启动前首先打开“活动”,一切才能顺利进行。然后,在那之后,每段代码都会做它必须做的事情。有人能解释一下为什么我必须启动活动才能让它工作吗?如何避免呢

2-我之所以使用此方法进行操作,是因为我不希望我的应用程序出现在应用程序列表中(对于用户)。我不想使用onReceive方法启动活动。 我试图从清单文件中删除以下几行,但我回到了问题“1”:如果我以前不能启动活动,它就不起作用(因为这些行被删除了,所以不可能启动任何东西)

首先:

谢谢你的帮助

有人能解释一下为什么我必须启动活动才能让它工作吗

因为从Android 3.1开始,当应用程序处于强制停止状态时,清单注册的接收者将无法工作。出现这种情况:

  • 第一次安装时

  • 用户点击设置中的“强制停止”按钮后

如何避免呢

仅支持Android 3.0及以下版本。请注意,这是Android设备市场的一个递减百分比

有人能解释一下我为什么不工作以及如何改正吗

见上文

这是“隐藏”我的应用程序的正确方法吗

您所描述的内容并不隐藏应用程序,而只是表示没有启动程序图标的应用程序。由于前面提到的强制停止限制,这些应用程序通常在Android 3.1中不再有用。而且,这些应用程序仍然列在其他选择列出应用程序的地方,例如设置应用程序

我删除了前面的几行(问题“2),并在清单文件的receiver部分(BOOT_COMPLETED action)添加了下面的一行,但它仍然没有改变任何东西。有什么线索吗

<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); 
  }
}