安卓实现QQ强制下线----来自第一行代码

首先需要一个能包含所有活动的类   到最后可以调用这个对象的方法 销毁所有活动

package com.example.broadcastbestpractice;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;

public class ActivityCollector {

private static List<Activity> activities = new ArrayList<Activity>();

public static void addActivity(Activity activity) {
activities.add(activity);
}

public static void removeActivity(Activity activity) {
activities.remove(activity);
}

public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}

}

//需要所有类继承这个类

package com.example.broadcastbestpractice;

import android.app.Activity;
import android.os.Bundle;

public class BaseActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}

@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}

}

登录活动

package com.example.broadcastbestpractice;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

//登录活动
public class LoginActivity extends BaseActivity {

//用户名视图
private EditText accountEdit;

//密码视图
private EditText passwordEdit;

//登录按钮视图
private Button login;

//单选框视图
private CheckBox rememberPass;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//获取相应的视图对象
accountEdit = (EditText) findViewById(R.id.account);
passwordEdit = (EditText) findViewById(R.id.password);
rememberPass = (CheckBox) findViewById(R.id.remember_pass);
login = (Button) findViewById(R.id.login);

//为登录按钮添加事件

login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String account = accountEdit.getText().toString();
String password = passwordEdit.getText().toString();
if (account.equals("admin") && password.equals("123456")) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(LoginActivity.this,
"account or password is invalid",
Toast.LENGTH_SHORT).show();
}
}
});
}

}

界面

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1" >

<TableRow>

<TextView
android:layout_height="wrap_content"
android:text="用户名:" />

<EditText
android:id="@+id/account"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
</TableRow>

<TableRow>

<TextView
android:layout_height="wrap_content"
android:text="密码:" />

<EditText
android:id="@+id/password"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</TableRow>

<TableRow>

<CheckBox
android:id="@+id/remember_pass"
android:layout_height="wrap_content" />

<TextView
android:layout_height="wrap_content"
android:text="记住 密码" />
</TableRow>

<TableRow>

<Button
android:id="@+id/login"
android:layout_height="wrap_content"
android:layout_span="2"
android:text="登录" />
</TableRow>

</TableLayout>

另外一个活动来测试强制下线

package com.example.broadcastbestpractice;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends BaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button forceOffline = (Button) findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("666");
Intent intent = new Intent(
"com.example.broadcastbestpractice.FORCE_OFFLINE");
sendBroadcast(intent);
}
});
}

}

界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
android:id="@+id/force_offline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send force offline broadcast" />

</LinearLayout>

强制下线广播接收器

package com.example.broadcastbestpractice;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.WindowManager;

public class ForceOfflineReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, Intent intent) {
System.out.println("555");
//弹出强制下线对话框
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder
.setMessage("You are forced to be offline. Please try to login again.");
dialogBuilder.setCancelable(false);
//为对话框按钮添加事件
dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击确定后销毁所有活动
ActivityCollector.finishAll();
//启动登录活动
Intent intent = new Intent(context, LoginActivity.class);
System.out.println(context);
//因为是在接收器中启动活动需要添加标记位
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
//
// //设置对话框的类型 保证在广播接收器中可以正常弹出
alertDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}

}

注册文件

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

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<activity
android:name=".LoginActivity"
android:label="mylogin" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity" >
</activity>

<receiver android:name=".ForceOfflineReceiver" >
<intent-filter>
<action android:name="com.example.broadcastbestpractice.FORCE_OFFLINE" />
</intent-filter>
</receiver>

</application>

</manifest>

时间: 2024-08-09 06:23:14

安卓实现QQ强制下线----来自第一行代码的相关文章

安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响

今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListener函数按照书中报错,原书如下所示: 但这样,报错,gradel提示该类不存在,现在还不清楚是不是因为作者版本太旧的原因,有待查证,后面,我用了下面方法,就编译通过,如下: 其实,我就是调用了AdapterView里面的OnItemClickListener方法而已. 此外,还发现一个问题,那就是我在grad

安卓模拟聊天界面---改编第一行代码

主界面 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:

安卓开发学习经历2--《第一行代码》coolweather项目SQL语句同一个“陷阱”掉两次 注意转义字符等特殊字符正确书写 关于Id字段自增加体会

今天,在运行<第一行代码>coolweather第二阶段代码,又一次报错,还是神奇地与昨天相似,提示,city_id字段不存在,这里我有两种理解,一种是sql语句出错了,另外一种是没有获取city_id值,关于前一种,我在”详细“检查比较了,County表的建表语句后,首先排除了,然后一股脑投入如何解决第二种问题当中,最后,再一次惨痛事实告诉我,以后只要提示“no such column” 的提示,那么毫无疑问,肯定是数据库里面没有这个字段也就是说,sql语句建表那里就出错了.如图: sql语

《第一行代码》BroadcastBestPractice中出现的问题及解决方案(关于AlertDialog系统对话框的使用)

该程序为<第一行代码>中的一个小demo,意在学习使用广播实现强制下线功能. 按<第一行代码>中的源码编写ForceOfflineReceiver类,用于接收广播并处理,代码如下: public class ForceOfflineReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { AlertDialog.Builde

Android开发——《第一行代码》自学中

大学时候学过C++,Java,算法,数据结构以及其他很多东西,但都学的不精.就要毕业照工作了,总要专注于一门技术,于是开始学安卓. 开发环境是在慕课网下的eclipse. <第一行代码>这本书我也才只看了不到一半,学到第五章广播,但犯过很多错误,抛出来嘲笑下以前的自己,大家引以为戒. 1 有安卓手机就不要用模拟器 由于各种教程都在使用安卓模拟器,导致我一开始学习也在用.但这个实在是很麻烦,我的电脑本来就是渣配置,模拟器开机就要等一年,开机后点个按钮都要等半天.而且经常卡的我的eclipse都不

第一章:开启启程你的第一行代码

前言: 其实我是认为视频比书本学的更快,看书是多么无趣, 有人说培训机构的学生失去了自学能力,的确如此 不管是视频还是资料我认为学会技能使用方法就行了 (还是买了第一行代码,一起学习学习吧!有颜色代表重点内容) 目录: 1.1 了解全貌,Android王国简介 1.1.1 安卓系统架构 1.1.2 安卓已经发布的版本 1.13 安卓应用开发特色 1.2 手把手搭建开发环境 1.2.1准备需要的环境 1.2.2搭建开发环境 1.3 创建你的一个Android项目 1.3.1创建Hello Worl

20172327 2017-2018-2 《第一行代码Android》第一章学习总结

学号 2017-2018-2 <第一行代码Android>第一章学习总结 教材学习内容总结 - Android系统架构: 1.Linux内核层 Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,Wi-Fi驱动,电源管理等. 2.系统运行底层 - 通过一些C/C++库来为Android系统提供了主要的特性支持 库名 功能 SQLite库 提供数据库的支持 OpenGL/ES库 提供3D绘图支持 Webkit

跟刷 《 Android Studio 单刷第一行代码》 记录坑

跟刷系列   Android Studio 单刷第一行代码 原帖地址http://www.cnblogs.com/DebugLife/p/4355687.html 记录自己的失误,也算是个督促自己了. 1. 坑--去除标题栏 在 Activity 的 onCreate()方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE);

《第一行代码》Android特色开发,基于位置服务,出现的问题

手机GPS定位较慢.精度高.耗电量多,网络定位较快.精度低.耗电量少 当位置精度要求非常高的时候,使用GPS定位:一般情况下,使用网络定位. 按<第一行代码>写了一个定位程序,真机一直没有定位信息输出,但是模拟器上有输出. 最后发现了问题,将手机上的定位模式改为移动网络定位,而不是GPS定位,定位信息会立刻显示出来. 是GPS定位较慢导致的. 还有一点,手机如果有链接WIFI,采用GPS定位可能显示不出来,最好使用数据网络(即手机自己的网)定位.