我希望在运行时通知从Android手机中移除SIM卡。
我的应用程序在GingerBread上运行,而它不在运行于ICS及更高版本的HTC One V上运行。 这是我的代码:
1)接收者类
package com.TestIt;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SimEventReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent systemIntent) {
// TODO Auto-generated method stub
Intent intent=new Intent(context, SimService.class);
context.startService(intent);
}
}
2)服务类
package com.TestIt;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
public class SimService extends Service {
TelephonyManager tele;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.d("Kanishk", "In Service OnCreate");
int simState = tele.getSimState();
switch (simState)
{
case TelephonyManager.SIM_STATE_ABSENT:
Log.d("kanishk", "onCreate1");
TestItActivity.simState(this);
break;
case TelephonyManager.SIM_STATE_READY:
Log.d("kanishk", "onCreate2");
Toast.makeText(this, "Now Sim is ok", Toast.LENGTH_LONG).show();
break;
case TelephonyManager.SIM_STATE_UNKNOWN:
Log.d("kanishk", "onCreate3");
Toast.makeText(this, "not Known", Toast.LENGTH_LONG).show();
break;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
3)活动 包com.TestIt;
import android.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
public class TestItActivity extends Activity {
/** Called when the activity is first created. */
private static final String tag = "Activity";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d(tag, "OnCreate");
setContentView(R.layout.main);
}
public static void simState()
{
Log.d(tag, "Sim State");
}
}
4)的Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.systemEvent"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".SystemEventActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".BroadCastReceiverS"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service android:name=".MyService" >
</service>
</application>
</manifest>
答案 0 :(得分:0)
从Android 3.1开始,安装后所有应用程序都设置为 STOPPED STATE 。当用户第一次运行应用程序时,应用程序将从 STOPPED STATE 中取出。当用户使用应用程序管理器手动停止应用程序时,应用程序也会返回 STOPPED STATE 。
由于您的应用程序仅包含Service
组件和BroadcastReceiver
组件,因此用户显然从不显式启动它(用户无法启动Activity
)。因此,您的应用程序永远不会被取消停止状态。
您的BroadcastReceiver
永远不会被运行,因为系统不会向停止状态中的应用发送广播Intent
。
详细了解此here。查看&#34;启动已停止应用程序控件&#34; 的部分。特别注意这句话:
请注意,系统会向所有人添加FLAG_EXCLUDE_STOPPED_PACKAGES 广播意图。这样做是为了防止来自后台的广播 来自无意或不必要的组件的服务 停止应用程序。后台服务或应用程序可以 通过添加FLAG_INCLUDE_STOPPED_PACKAGES来覆盖此行为 用于广播应该被允许激活停止的意图的标志 应用
应用程序在首次安装时处于停止状态但是 尚未启动以及何时由用户手动停止 (在管理应用程序中)。