Android在后台秘密运行app

时间:2013-02-05 20:00:18

标签: android

我有一个客户端需要一个将在后台运行的间谍应用程序 - 接收消息,发送消息,gps位置等。我可以启动没有Activity用户界面的服务吗?据我所知,我需要一个服务和接收器,我还需要打电话给接收器让我们说电池电量低,电池没电 - 有些经常触发意图。我如何在模拟器上测试它?

现在这就是我所拥有的

public class MyReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

    if(intent.getAction() != null)
    {
        if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
            intent.getAction().equals(Intent.ACTION_USER_PRESENT))
        {
            context.startService(new Intent(context, MyService.class));
        }
    // TODO Auto-generated method stub

}

}     }

接收者和

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Service created ...",Toast.LENGTH_LONG).show();


}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}


@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed ...",
Toast.LENGTH_LONG).show();

}

}

服务。 我把它放在我的清单中

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.services"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="4"
    android:targetSdkVersion="4" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <service android:name=".MyService"></service>
    <receiver  android:name=".MyReceiver"></receiver>
</application>

我的方式很好吗?

2 个答案:

答案 0 :(得分:0)

这个答案有两个部分:

有可能在Android 3.0之前

Upto Android 2.3,应用程序可以为任何事件注册广播接收器,它们甚至会在发生时启动。这可以是启动完成,屏幕开/关,基本上任何东西。

3.0以上不可能

3.0为接收事件广播引入了一个非常有用的条件。您的应用必须至少已启动才会收到活动。如果用户安装了您的应用程序,但从未打开它,那么即使您在应用程序中为它们定义了接收器,也不会收到任何广播。

另外,请记住,您的应用可以在任何时间由用户或系统本身强制停止。此外,运行ICS及更高版本的用户可以选择禁用应用程序,这可确保除非手动重新启用,否则它们将永远不会运行。你无法控制这两种情况。

拥有一个万无一失的间谍应用程序的唯一方法是将其烘焙到设备的ROM中,这在针对多个设备时不太可行。

答案 1 :(得分:0)

是您可以在没有用户互动的情况下启动Service。但是你肯定需要一些东西才能触发代码“你启动服务的地方”吧?

为此,我建议您再次使用一个非常频繁的BroadcastReceiver,例如Phone_state_change"Incoming_mesage" Time_tick。所以当它发生时你会调用你的onReceive方法,你可以从那里开始你的服务,你需要检查服务是否还在运行吗?

我建议您定义sticky BroadcastReceiver。注册后它会立即调用onReceive,因此您start也可以service来自此处。{/ p>

这就是我所做的,希望它对你有用。让我知道输出。

快乐的编码。 :)