[英]Android Widget development
我是android开发的新手。
我有一个应用程序,每秒从USB读取到串行连接。 然后,该应用程序使用新数据更新MainActivity的UI。 我的应用程序还具有一个小部件,该小部件也随新数据一起更新。 但是,当调用onDestroy()方法时,此小部件将停止工作,效果很好。
我见过几个应用程序,即使从未启动过该应用程序,该窗口小部件仍可继续工作和更新。 至少不是我所知。
怎么做? 我希望我的窗口小部件可以运行并且在没有运行该应用程序的情况下也可以运行。 这可能吗?
更新:
这是我MainActivity的onCreate()的摘录
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final HandlerThread hTh = new HandlerThread("HT");
hTh.start();
final long oneScd = 1000;
final Handler handler = new Handler(hTh.getLooper());
Runnable updateDisplay = new Runnable(){
@Override
public void run() {
updateDisplay(GlobalSpeed._json);
}
};
Runnable eachSec = new Runnable() {
@Override
public void run() {
runOnUiThread(updateDisplay);
handler.postDelayed(this, oneScd);
}
};
handler.postDelayed(eachSec, oneScd);
这是我的AppWidgetProvider代码:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
try {
updateWidgetContent(context, appWidgetManager);
} catch (Exception e) {
Log.e(DEBUG_TAG, "Failed", e);
}
}
public void updateWidgetContent(final Context context, final AppWidgetManager appWidgetManager) {
Intent launchAppIntent = new Intent(context, SoleWidgetProvider.class);
service = PendingIntent.getActivity(context, 0, launchAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
hTh.start();
final long oneScd = 4000;
final Handler handler = new Handler(hTh.getLooper());
Runnable eachSec = new Runnable(){
@Override
public void run() {
String js;
js = GlobalSpeed._json;
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.sole_widget_layout);
remoteView.setTextViewText(R.id.wSpeed, js);//"Speed: " + String.valueOf(s.realSpeed())
ComponentName componentName = new ComponentName(context, SoleWidgetProvider.class);
appWidgetManager.updateAppWidget(componentName, remoteView);
handler.postDelayed(this, oneScd);
}
};
handler.postDelayed(eachSec, oneScd);
}
这是我的服务,该服务从串行通信获取响应并设置GlobalSpeed._json值。
public class WidgetUpdateService extends Service {
public static final String DEBUG_TAG = "SoleWidgetService";
public static String json;
private SerialComunicator serComm;
private Context context;
@Override
public void onStart(Intent intent, int startId){
super.onStart(intent, startId);
Log.d(DEBUG_TAG, "Sevice Started");
serComm = new SerialComunicator(this);
buildUpdate();
}
private void buildUpdate(){
HandlerThread hTh = new HandlerThread("SHT");
final long oneScd = 4000;
hTh.start();
final Handler handler = new Handler(hTh.getLooper());
Runnable readSerial = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
GlobalSpeed._json = serComm.readDataFromSerial();
handler.postDelayed(this, oneScd);
}
};
handler.postDelayed(readSerial, oneScd);
}
public void displayToast(String msg){
Toast.makeText(this, serComm.readDataFromSerial(), Toast.LENGTH_SHORT);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
希望这是足够的代码。
一切正常,当我进入主屏幕并调用该应用程序的onStop()方法时,它会正常工作,并且小部件会持续更新。 但是,当我从最近的应用程序中删除该应用程序,并且调用onDestroy()方法时,该小部件将停止更新。
我希望小部件的功能独立于应用程序。 我可以吗? 我知道SEEM可以独立于其应用程序运行的一些小部件。
您将需要编写一个在后台运行的服务,然后通过一个意图来更新小部件(以及应用程序)。
在android中,当应用不在前台时,它会被暂停,因此任何正在运行的代码也会被暂停。
服务独立于应用程序。 阅读有关服务的信息。 您可以在启动时启动它,也可以让窗口小部件在需要数据时触发服务。
不过,要考虑的一件事是每秒更新数据会消耗电池。 小部件通常用于偶尔(每30分钟,每小时等)而不是每秒更新数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.