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

时间:2014-01-23 18:02:13

标签: java android service broadcastreceiver boot

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

我对我制作的代码有疑问。

---摘要:
代码在BOOT_COMPLETED处启动ClsAutoStart,它启动一个服务SvcFirst,它注册一个与NEW_OUTGOING_CALL动作同步的BroadcastReceiver。在onReceive()方法中,我启动了活动。

您了解该活动应该在通话时弹出(无条件)。

---问题:
这有效,但我没有确切的预期行为,所以我有一些问题:

1-如果我首先在安装后和重启之前打开活动,那么一切顺利。然后,在那之后,每一段代码都会做它所拥有的。任何人都可以解释为什么我必须启动活动以使其工作?如何避免呢?

2-我使用此方法执行操作的原因是因为我不希望我的应用程序出现在应用程序列表中(对于用户而言)。我不想通过onReceive方法启动活动。 我试图从清单文件中删除以下行,但我回到问题“1”:如果我以前无法启动活动,则它不起作用(因为删除了行,所以无法启动任何内容)。 / p>

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

有人能解释我为什么不工作以及如何纠正它? 这是“隐藏”我的申请的正确方法吗? 在stackoverflow上,我找到了很多答案......这是其中之一(问题“3”是其中一个......)。

3-我删除了前面的行(问题“2)并在我的清单文件中的接收者部分(BOOT_COMPLETED操作)中添加了以下一行但是它仍然没有改变任何东西。任何线索?

<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>

ClsAutoStart:

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

SvcFirst:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

有人可以解释一下为什么我必须启动活动以便它起作用吗?

因为清单注册的接收器在应用程序处于强制停止状态时不起作用,从Android 3.1开始。发生这种情况:

  • 首次安装时

  • 用户点击设置

  • 中的“强制停止”按钮后
  

如何避免它?

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

  

有人能解释我为什么不工作以及如何纠正它?

见上文。

  

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

您所描述的内容并不隐藏应用程序,而仅代表没有启动器图标的应用程序。由于上述强制停止限制,此类应用程序通常在Android 3.1中无用。而且,这些应用程序仍然列在其他选择列出应用程序的地方,例如“设置”应用程序。

  

我删除了之前的行(问题“2)并在我的清单文件中的接收器部分(BOOT_COMPLETED操作)中添加了以下一行但它仍然没有改变任何内容。任何线索?

<category>很少与接收器一起使用。 HOME类别与活动一起使用,并指定主屏幕实现。