精华内容
下载资源
问答
  • Broadcast学习--模仿qq强制下线功能

    千次阅读 2016-05-21 14:57:46
    在该例子中,我会实现一个简单的登录功能,登陆成功后点击按钮发送一条强制下线的广播,在广播接收器中进行处理,弹出对话框要求用户强制下线,并...通过该例子主要学习如何发送自定义广播以及如何接收广播并进行处理。

    在该例子中,我会实现一个简单的登录功能,登陆成功后点击按钮发送一条强制下线的广播,在广播接收器中进行处理,弹出对话框要求用户强制下线,并跳转到登陆界面。通过该例子主要学习如何发送自定义广播以及如何接收广播并进行处理。


    简单的登录界面

    <?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:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:orientation="horizontal"
            android:padding="10dp" >
    
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="username"
                android:textSize="15sp" />
    
            <EditText
                android:id="@+id/login_userName_EditText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_weight="3"
                android:hint="input your useruame" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10dp" >
    
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="password"
                android:textSize="15sp" />
    
            <EditText
                android:id="@+id/login_password_EditText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_weight="3" />
        </LinearLayout>
    
        <Button
            android:id="@+id/login_loginButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="20dp"
            android:text="Login" />
    
    </LinearLayout>



    布局很简单



    登录的处理,如果用户名="user"密码="123456",就进入SecondActivity,否则Toast一下


    public class SecondActivity extends BaseActivity implements OnClickListener{
    	
    	private Button mLoginButton;
    	private EditText mUserNameEditText;
    	private EditText mPasswordEditText;
    	
    	private static final String TAG="Secondctivity";
    
    	@Override
    	public void findId() {
    		mLoginButton=(Button) findViewById(R.id.login_loginButton);
    		mUserNameEditText=(EditText) findViewById(R.id.login_userName_EditText);
    		mPasswordEditText=(EditText) findViewById(R.id.login_password_EditText);
    	}
    
    	@Override
    	public void setListener() {
    		mLoginButton.setOnClickListener(this);
    	}
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.login);
    	}
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.login_loginButton:
    			String userName=mUserNameEditText.getText().toString();
    			String password=mPasswordEditText.getText().toString();
    			
    			if(userName.equals("user") && password.equals("123456")){
    				startActivity(new Intent(SecondActivity.this,ThreeActivity.class));
    				finish();
    			}else{
    				Toast.makeText(SecondActivity.this, "用户名或密码错误", Toast.LENGTH_LONG).show();
    			}
    			break;
    		}
    	}
    
    }


    ThreeActivity只有一个按钮,界面和布局代码都不再给出,该按钮的功能是点击后发出一条强制下线的广播

    首先构建一个Intent对象,把要发送的值传进去,然后调用Context的sendBroadcast方法,将广播发出去,这样所有监听 com.xu.broadcastPractice.FORCE_OFFLINE广播的接收器都会接受到该条广播。


    public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.three_forceButton:
    			
    			Intent intent=new Intent("com.xu.broadcastPractice.FORCE_OFFLINE");
    			sendBroadcast(intent);
    			break;
    		default:
    			break;
    		}
    	}


    定义广播接收器


    广播接收器都要继承BroadcastReceiver类,然后重写他的onReceive方法,在该程序中,我们接受到广播后会掏出一个对话框,setCancelable(false)设置不能点击取消,然后设置了点击ok键的处理,利用ActivityManager将所有activity finish掉,并且重新启动登陆界面

    并且设置对话框类型为系统弹出

    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    注意加上权限

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


    public class ForceOffLineBroadcastReceiver extends BroadcastReceiver{
    
    	@Override
    	public void onReceive(final Context context, Intent intent) {
    		AlertDialog dialog= new AlertDialog.Builder(context).setTitle("worning!").setMessage("You are forced to "
    				+ "be offline.Please try to login again.").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
    					
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						ActivityManager.getInstance().clear();
    						Intent intent=new Intent(context,SecondActivity.class);
    						intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    						context.startActivity(intent);
    					}
    				}).create();
    		
    		dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    		dialog.show();
    	}
    
    }

    在配置文件中定义广播接收器,作为android的四大组件,都需要在AndroidMamifest.xml文件中进行配置,配置代码如下

     <receiver 
                android:name=".ForceOffLineBroadcastReceiver"
                >
                <intent-filter >
                    <action android:name="com.xu.broadcastPractice.FORCE_OFFLINE"/>
                </intent-filter>
       </receiver>

    name属性为自己定义的广播接收器,然后intent-filter标签下的action属性name 为需要接收的广播值,这样定以后,ForceOffLineBroadcastReceiver接收器将会接收到广播值为com.xu.broadcastPractice.FORCE_OFFLINE的广播。


    运行结果



    这样用户就只能点击OK,并且回到登陆界面



    我们也可以动态注册广播,修改ThreeActivity的代码进行动态注册,并且将AndroidManifest.xml中注册的broadcastReceiver删掉,注意在onDestroy方法中取消注册,运行程序我们可以得到相同的效果

    public class ThreeActivity extends BaseActivity implements OnClickListener{
    	
    	private Button mForceButton;
    	private IntentFilter mIntentFilter;
    	private ForceOffLineBroadcastReceiver mReceiver;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.activity_three);
    		
    		mIntentFilter=new IntentFilter();
    		mIntentFilter.addAction("com.xu.broadcastPractice.FORCE_OFFLINE");
    		mReceiver=new ForceOffLineBroadcastReceiver();
    		registerReceiver(mReceiver, mIntentFilter);
    	}
    
    	@Override
    	public void findId() {
    		mForceButton=(Button) findViewById(R.id.three_forceButton);
    	}
    
    	@Override
    	public void setListener() {
    		mForceButton.setOnClickListener(this);
    	}
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.three_forceButton:
    			
    			Intent intent=new Intent("com.xu.broadcastPractice.FORCE_OFFLINE");
    			sendBroadcast(intent);
    			break;
    		default:
    			break;
    		}
    	}
    	@Override
    	protected void onDestroy() {
    		unregisterReceiver(mReceiver);
    		super.onDestroy();
    	}
    
    }



    展开全文
  • 比如 QQ 号在别处登录后,就会把当前的 QQ 号挤下线。实现思路是:在界面上弹出一个对话框,让用户无法进行任何其他操作,只能点击对话框中的确定按钮, 然后回到登录界面。 要实现强制下线之前,必须先关闭所有的...

    在应用程序中的一个常见功能是 “强制下线”。比如 QQ 号在别处登录后,就会把当前的 QQ 号挤下线。实现思路是:在界面上弹出一个对话框,让用户无法进行任何其他操作,只能点击对话框中的确定按钮, 然后回到登录界面。

    要实现强制下线之前,必须先关闭所有的活动。首先,创建一个 Activities 类用于管理所有的活动:

    public class Activities {
    
        public static List<Activity> activities = new ArrayList<>();
    
        /**
         * 新增活动
         *
         * @param activity
         */
        public static void add(Activity activity) {
            activities.add(activity);
        }
    
        /**
         * 移除活动
         *
         * @param activity
         */
        public static void remove(Activity activity) {
            activities.remove(activity);
        }
    
        /**
         * 结束所有活动
         */
        public static void finishAll() {
            for (Activity activity : activities) {
                if (activity.isFinishing()) {
                    activity.finish();
                }
            }
        }
    }

    然后创建 BaseActivity 类作为所有活动的父类:

    public class BaseActivity extends AppCompatActivity {
       @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Activities.add(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Activities.remove(this);
        }
    }

    接下来要创建一个登录界面,新建 LoginActivity(在 Android Studio 中,建议创建空的活动),编辑 activity_login.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="horizontal">
    
            <TextView
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="账号:"
                android:textSize="18sp" />
    
            <EditText
                android:id="@+id/account"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="horizontal">
    
            <TextView
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="密码:"
                android:textSize="18sp" />
    
            <EditText
                android:id="@+id/password"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:inputType="textPassword" />
        </LinearLayout>
    
        <Button
            android:id="@+id/login"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:text="登录" />
    </LinearLayout>
    

    我们使用 LinearLayout 编写了一个登陆布局,使用纵向排列,从上到下分别是账号、密码和登陆按钮。

    接着修改 LoginActivity 中的代码:

    public class LoginActivity extends BaseActivity  {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
    
            final EditText accountEditText=(EditText)findViewById(R.id.account);
            final EditText passwordEditText=(EditText)findViewById(R.id.password);
    
            Button loginBtn=(Button)findViewById(R.id.login);
            loginBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    String account=accountEditText.getText().toString();
                    String password=passwordEditText.getText().toString();
    
                    if(account.equals("admin")&&password.equals("1")){//登录成功
                        startActivity(new Intent(LoginActivity.this,MainActivity.class));
                        finish();
                    }else{//登录失败,弹出提示
                        Toast.makeText(LoginActivity.this, "账号或密码不正确", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
        }
    }

    LoginActivity 继承自 BaseActivity。然后获取账号与密码的输入值,进行判断。如果登录成功,就启动 MainActivity 活动;否则登录失败,弹出提示。

    这里假设把 MainActivity作为登陆成功后进入的主界面,修改对应的布局文件:

    <?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:gravity="center_horizontal"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/force_offline"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="发送强制下线广播"
            />
    </LinearLayout>

    这里,我们只定义了一个按钮,用于触发强制下线功能。然后修改 MainActivity 中的代码:

    public class MainActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            findViewById(R.id.force_offline).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sendBroadcast(new Intent("net.deniro.android.FORCE_OFFLINE"));
                }
            });
        }
    }

    在按钮的点击事件中发送了一条广播,用于通知程序让强制用户下线。

    强制用户下线的逻辑是写在接收这条广播的广播接收器里面,这样强制下线的功能就不会依附于任何的界面,不管是在程序的任何地方,只需要发出这样一条广播,就可以完成强制下线的操作啦O(∩_∩)O~

    我们在 BaseActivity 中动态注册了一个广播接收器,因为所有的活动都是继承自 BaseActivity 的,这样这些活动就都可以支持这个广播接收器咯。

    修改 BaseActivity 中的代码:

    public class BaseActivity extends AppCompatActivity {
    
        private ForceOffLineReceiver receiver;
        ...
        private class ForceOffLineReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(final Context context, Intent intent) {
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setTitle("警告");
                builder.setMessage("您已被迫下线,请重新登录!");
                builder.setCancelable(false);
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Activities.finishAll();//销毁所有活动
                        context.startActivity(new Intent(context, LoginActivity.class));//启动【登录】活动
                    }
                });
                builder.show();
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            //注册广播接收器
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("net.deniro.android.FORCE_OFFLINE");
            receiver = new ForceOffLineReceiver();
            registerReceiver(receiver, intentFilter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if(receiver!=null){//注销
                unregisterReceiver(receiver);
            }
            receiver=null;
        }
    }

    这里使用了 AlertDialog,并 setCancelable() 让对话框不可取消(如果可取消,用户点击一下 back 键,对话框就没啦),然后使用 setPositiveButton() 方法定义【确定】按钮,当用户点击按钮时,销毁所有活动并/启动【登录】活动。

    我们重写了 onResume() 和 onPause() 这两个生命周期的函数,然后分别在这两个方法里注册和注销了自定义的广播接收器,之所以这样写是因为我们要始终需要保证只有处于栈顶的活动才能接收到下线广播,非栈顶活动不需要也没有必要接收这条广播。

    最后修改 AndroidManifest.xml:

    <activity
                android:name=".LoginActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

    将 LoginActivity 设置为主活动。

    运行程序:

    登录界面

    输入正确的账号和密码后,点击登录进入主界面:

    主界面

    点击【发送强制广播】按钮:

    强制下线提示

    展开全文
  • 第【897】期早报由【周四】赞助播出01今日头条QQ号注销功能再次下线近日,许多网友发现QQ号能注销了。不过从今天起,QQ号的注销功能再次下线。对此,腾讯方面表示,这是QQ团队对QQ账号注销功能的灰度测试。为了给...
        

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    第【897】期早报由【周四】赞助播

    01


    今日头条


    QQ号注销功能再次下线


    近日,许多网友发现QQ号能注销了。不过从今天起,QQ号的注销功能再次下线。对此,腾讯方面表示,这是QQ团队对QQ账号注销功能的灰度测试。为了给用户更好的使用体验,已在3月21日暂时下线了该功能,将在进一步优化体验后,再次上线。


    此前,有用户表示QQ上线了注销功能。用户可以前往“设置-帮助-基础功能-QQ账号如何注销-点击此处”或“通过手机客户端扫描指定二维码”,按照提示填写相关信息,提交QQ号码注销申请,等待客服审核。审核通过后,QQ号即被注销。


    不过北青报记者发现,昨天起,该功能已经下线。对此,腾讯方面回应称,近日,QQ团队对QQ账号注销功能进行了灰度测试,收集到了参与用户对该功能的许多反馈。为了给用户更好的使用体验,我们在3月21日暂时下线了该功能,将在进一步优化体验后,再次上线。

    02


    国内资讯


    1.阿里与京东最快六月“回A股”发行CDR


    3月21日消息,财新网报道,证监会正在加快制定CDR细则,有望一两个月内出台。多家保荐机构已在为阿里巴巴和京东准备材料,争取今年六月发行CDR。消息称,阿里巴巴和京东已经就国内发行CDR确定了保荐机构,其中阿里巴巴方面保荐机构为中信证券。亦有接近阿里的市场人士指出由于阿里巴巴CDR发行规模较大,不排除还会再选一家联席保荐机构。中金方面表示正在积极争取。京东CDR发行的保荐机构则是华箐证券、中信建投证券,华泰联合担任财务顾问。此外,腾讯在刚刚的业绩会上也表示,如条件比较成熟,也会考虑以CDR形式在内地上市。


    2.腾讯公布2017年Q4财报:收入663.92亿元同比增长51%


    3月21日消息,腾讯公布2017年四季度财报,数据显示,腾讯四季度收入663.92亿元,同比增长51%,环比增长2%;净利润207.97亿元,同比增长98%,环比增长16%。2017年,腾讯收入2377.60亿元,同比增长56%,净利润715.1亿元,同比增长74%。


    3.蚂蚁基金违规销售被浙江监管局责令改正


    3月21日消息,浙江监管局官方网站发布消息称,蚂蚁(杭州)基金销售有限公司在“财富号红包活动”中存在以送现金红包方式销售基金的违规行为,责令改正。浙江监管局公告显示,述行为违反了《证券投资基金销售管理办法》,根据《证券投资基金销售管理办法》第八十七条的规定,决定对你公司采取责令改正的监督管理措施。


    4.用户起诉支付宝索赔2元,质疑其个人信息遭非法搜集


    3月21日上午消息,海淀法院官网发布案件快报,俞先生称,其在北京乐友公司购买牙膏使用支付宝结账,事后发现支付宝客户端默认勾选了“授权淘宝获取你线下交易信息并展示”,其在线下店铺的交易信息被提供给支付宝、淘宝、天猫。俞先生认为上述四公司共同侵犯了其对个人信息被收集、利用的知情权,故诉至法院,要求四被告向其道歉、删除其个人信息数据并赔偿经济损失、精神损害抚慰金各1元。日前,海淀法院受理了此案。

    03

    国际资讯


    1.亚马逊超越谷歌母公司Alphabet,市值全球第二


    3月21日消息,据国外媒体报道,截至当地时间周二收盘,亚马逊市值已经超越谷歌母公司Alphabet成为世界第二大最有价值公司,位列苹果之后。

    据悉今年以来,亚马逊股票价格飙升了35%,而Alphabet股票上涨仅为4%。与此同时,Facebook由于股价下跌使得其市值排名已经跌至伯克希尔哈撒韦公司(Berkshire Hathaway)之后。据报道,电子商务巨头亚马逊周二股价上涨2.7%,总市值达到7680亿美元。谷歌母公司Alphabet股价微跌0.4%,目前总市值为7625亿美元。


    2.比特币区块链被非法利用:被曝存储儿童色情内容


    3月21日消息,据国外媒体报道,德国亚琛工业大学的研究人员最近下载了整个比特币区块链,发现它包含了儿童色情网站的链接以及“轻度裸体”的未成年人图片。他们正在调查区块链的非财务数据以揭露“令人反感”的内容,偶然发现了令人震惊的事情。研究人员在2月下旬召开的2018年金融密码学和数据安全会议上发表了一篇新的论文。比特币的区块链总内存达122GB。研究人员得出的结论是,所有区块链交易中只有1.4%包含非财务数据,占整个区块链交易量的118.5MB。更重要的是,他们实际阅读的数据交易只占22.6MB。这是他们偶然发现儿童色情内容的地方。


    3.Facebook被北欧最大银行列入黑名单


    据外媒报道,北欧地区最大的银行北欧联合银行(Nordea Bank)已将Facebook列入黑名单,不再允许其可持续投资部门购买该公司股票。北欧联合银行可持续金融部门主管Sasja Beslik在Twitter上写道,银行已经决定将它对Facebook的投资从资产管理部门“隔离”出来,原因是高层披露的信息和围绕该公司的动荡引起了公众的强烈反对。他还提到“对平台加强监管的风险”以及欧盟的新数据保护法规。


    4.全球知名瓶装水品牌受塑料颗粒污染


    3月21日据国外媒体报道,近期一项在9个国家进行的调查研究称,众多世界知名品牌的瓶装水受到了微型塑料颗粒的污染。这些塑料颗粒可能是在装瓶过程中渗入水中。该研究由美国纽约州立大学弗雷多尼亚分校的研究者谢里·梅森(Sherri Mason)主持,美国的非营利性聚合媒体Orb Media发布了研究报告新闻稿。研究人员在巴西、印度、印度尼西亚、肯尼亚、黎巴嫩、墨西哥、泰国和美国检测了总共250瓶水,在其中93%的水样中检测到了塑料颗粒,涉及的品牌包括Aqua、阿夸菲纳(Aquafina)、达萨尼(Dasani)、依云(Evian)、雀巢优活(Nestle Pure Life)和圣沛黎洛(San Pellegrino)等。


    5.Facebook因数据丑闻蒸发600亿美元,拖累社交媒体股


    3月21日,在Facebook数据泄露丑闻爆出之后,众多社交媒体都可能会面临更加严厉的监管措施,新措施有可能会对社交媒体企业的业务产生影响,本周二Facebook、Twitter以及Snap的股价均出现了进一步下跌。在被爆出用户的个人数据被滥用事件之后,Facebook的股价下跌了4.75%。从上周五开始,Facebook截止到目前的市值已经蒸发了600亿美元。周二也是Facebook自2014年以来交易量最多的一天,1.29亿股出现了换手。


    6.外媒:小米合理估值为500亿美元


    中国手机制造商小米准备年底上市,但是目前有关小米公司的估值,媒体和业内人士说法大相径庭,从数百亿美元1000亿美元到2000亿美元,一些说法甚至到了“毫无根据信口开河”境界。据外媒最新消息,美国福布斯网站日前发表分析文章认为,小米的合理估值在500亿美元。需要指出的是,小米的业务和估值过去曾经经历“过山车”。小米长期估值在数百亿美元,和美国网约车公司Uber接近。在最糟糕境地时,外媒甚至报道市值已经跌落至几十亿美元。

    发现钛媒体,72问新生机;碎片时间,系统学习

    640?wx_fmt=jpeg

    点击阅读原文订阅孙振耀「72问」专栏,精彩不容错过

    展开全文
  • android实现强制下线功能

    千次阅读 2017-01-06 21:49:34
    那么这种强制下线的功能是如何实现的呢?其实非常的简单,就是一个广播。当我们的基类收到这个广播之后,点击对话框中的按钮。强制关闭所有的Activity。然后进入登录界面就可以了。先看一下今天的演示效果吧。

          我们可能都会遇见过下面这种情况,例如我们的QQ,当有其他的手机登录我们的账号之后,就会弹出一个对话框,意思就是“我们的账号在其他地方登录,您已被强制下线”。点击按钮之后,我们就会重新进入登录界面。那么这种强制下线的功能是如何实现的呢?其实非常的简单,就是一个广播。当我们的基类收到这个广播之后,点击对话框中的按钮。强制关闭所有的Activity。然后进入登录界面就可以了。先看一下今天的演示效果吧。

     

       从上面的功能图可以看到

        登录界面--->主界面(按钮)—>点击按钮(弹出被迫下线对话框)—>点击对话框的确定按钮—>登录界面

        第一步:我们按照这个流程做一遍。首先我们新建一个项目ForceOffLineTest。新建一个ActivityCollector。起作用是回收所有的Activity,我们使用这个类的目的就是点击对话框中的按钮时,能够结束所有的Activity,听起来有点像之前我们使用过的点击按钮退出整个程序的功能。其实实现方法是一样的。看源代码:

    package com.fdd;
    
    import java.util.ArrayList;
    import java.util.List;
    import android.app.Activity;
    
    public class ActivityCollector {
    	//声明一个List集
    	public static List<Activity> activities=new ArrayList<Activity>();
    	
    	//将activity添加到List集中
    	public static void addActivity(Activity activity){
    		activities.add(activity);
    	}
    	
    	//将某一个Activity移除
    	public static void removeActivity(Activity activity){
    		activities.remove(activity);
    	}
    
    	//结束所有添加进来的的Activity
    	public static void finishAll(){
    		for(Activity activity:activities){
    			//如果activity没有销毁,那么销毁
    			if(!activity.isFinishing()){
    				activity.finish();
    			}
    		}
    	}
    }
    
    第二步     新建一个基类,BaseActivity, 我们会在这个类中调用上面ActivityCollector的方法。我们定义好了之后。让下面所有的Activity全部继承与BaseActivity。
    package com.fdd;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    
    public class BaseActivity extends Activity {
    	
    	private MyReceiver receiver;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		//将启动的Activity添加进来
    		ActivityCollector.addActivity(this);
    	}
    	
    	@Override
    	protected void onDestroy() {
    		ActivityCollector.removeActivity(this);
    		super.onDestroy();
    	}
    	
    	//注册广播
    	@Override
    	protected void onResume() {
    		IntentFilter fliter=new IntentFilter();
    		fliter.addAction("OffLine");
    		receiver=new MyReceiver();
    		registerReceiver(receiver, fliter);
    		super.onResume();
    	}
    
    	//注销广播
    	@Override
    	protected void onPause() {
    		unregisterReceiver(receiver);
    		super.onPause();
    	}
    	
    	//接收广播
    	private class MyReceiver  extends BroadcastReceiver{
    
    		@Override
    		public void onReceive(final Context context, Intent intent) {
    			AlertDialog.Builder builer=new AlertDialog.Builder(context);
    			builer.setTitle("强制下线广播")
    			.setMessage("您的账号在异地登录")
    			.setCancelable(true)//设置取消按钮不能使用,
    			.setPositiveButton("确定", new OnClickListener() {
    				
    				@Override
    				public void onClick(DialogInterface dialog, int which) {
                               ActivityCollector.finishAll()             Intent in=new Intent(context ,LoginActivity.class);
    					startActivity(in);
    				}
    			}).show();
    		}
    		
    	} 
    }
    
    我们可以看到,我们在里面主要完成了两个功能。我们对里面的几个方法,一个一个叙述。

    第一:调用ActivityCollector中的三个方法。

    @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		//将启动的Activity添加进来
    		ActivityCollector.addActivity(this);
    	}
    我们由于我们的子类会继承BaseActivity。这样每当我们得BaseActivity创建的的时候,会将之类的实例加载进来。
    @Override
    	protected void onDestroy() {
    		ActivityCollector.removeActivity(this);
    		super.onDestroy();
    	}
    这个方法更好理解,当我们销毁BaseActivity就会把加载进来的子类全部销毁,这样就完成了退出程序的功能。

     第二:注册一个广播,并实现广播:在文章的开始我们提到过我们的下线功能是通过广播来完成的,我们的广播就是在这里去接受的。  

    //接收广播
    	private class MyReceiver  extends BroadcastReceiver{
    
    		@Override
    		public void onReceive(final Context context, Intent intent) {
    			AlertDialog.Builder builer=new AlertDialog.Builder(context);
    			builer.setTitle("强制下线广播")
    			.setMessage("您的账号在异地登录")
    			.setCancelable(true)//设置取消按钮不能使用,
    			.setPositiveButton("确定", new OnClickListener() {
    				
    				@Override
    				public void onClick(DialogInterface dialog, int which) {
    					ActivityCollector.finishAll()                Intent in=new Intent(context ,LoginActivity.class);
    					startActivity(in);
    				}
    			}).show();
    		}
    		
    	} 
    我们在接受广播的时候,弹出一个强制下线的对话框,注意我们得“取消”一定要设置成不可用。否则我们点击取消按钮仍然还会停留在原来的界面。

           接下来的就简单了,新建我们的登录界面LoginActivity。在这个Activty中我们的默认用户名为admin,密码123456。

    public class LoginActivity extends BaseActivity {
    
    	private Button login;
    	private EditText username;
    	private EditText password;
    	private String username_str;
    	private String password_str;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.login);
    		super.onCreate(savedInstanceState);
    		
    		login=(Button) findViewById(R.id.login);
    		username=(EditText) findViewById(R.id.username);
    		password=(EditText) findViewById(R.id.password);		
    		
    		login.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				//注意:一定要在此处获取.如果在外面获取的话
    				//得到的值即为一开始初始化得值
    				username_str=username.getText().toString();
    				password_str=password.getText().toString();
    				
    				if(username_str.equals("admin")&&password_str.equals("123456")){
    					Intent intent=new Intent(LoginActivity.this,MainActivity.class);
    					startActivity(intent);
    					finish();
    				}else{
    					Toast.makeText(LoginActivity.this, "输入有误", 3000).show();
    				}
    			}
    		});
    	}
    }
      我们需要继承BaseActivity。默认密码和用户名。

       好了最后一步,我们在MainActivity中发送广播

    public class MainActivity extends BaseActivity {
    
    	//发送广播按钮
    	private Button sendBroadCase;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sendBroadCase=(Button) findViewById(R.id.sendBroadCast);
            //发送下线广播
            sendBroadCase.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public  void onClick(View v) {
    				Intent intent=new  Intent("OffLine");
    				sendBroadcast(intent);
    			}
    		});
            
        }
    }
    
           

         总结:我们发送的广播是动态的,也就是在java代码中添加的在BaseActivty的onResume方法中我们可以看到。


    展开全文
  • 要是用隐身的话,会被在线的好友看到,先是上线,有马上下线,很容易被看出是隐身。软件也可实现该功能。 不过网页的好像更方便,把做好的网页加到收藏夹,或者弄成自己的首页,想上QQ的时候,先打开看看情况
  • 一个账号不能同时在多台机器登陆,一个机器登录后,另一台登陆着的机器账号会被踢下线.</p>
  • 在2017年下半年第三方支付非常火,很多做偏门生意的boss们挣钱挣到手发软,随即一码付线下线上一码付收款付款开始流行。下面由商务信息网(www.6t12.com)小编教你自作QQ+微信+支付宝收款一码付收款二维码。 需要...
  • 如何做好服务降级

    千次阅读 2016-04-13 18:14:19
    转:http://www.maben.com.cn/archives/800.html 如何做好服务降级?...1. 具体业务具体分析,例如qq的降级 当带宽不够时 先砍视频通话 接着砍语音 传文件 聊天 好友在线 至少保留自己在线 — twin 2. 问: 就直接下线
  • 仿QQ即时通信系统开发(2016版)

    万人学习 2016-11-12 19:20:20
    共22讲,讲解如何实现一个仿腾讯QQ即时通信系统的课程;主要功能有:用户注册,登录,登录后QQ号码保存在登录下拉框中;修改个人资料,查找好友,添加好友,删除好友;在线聊天,上线通知,下线通知,更改状态,更换...
  • 您的帐号于2019-07-03 09:20:30在另一地点(ip:127.0.0.1)登录,您已被迫下线。这样的情况在生活中也见到很多了吧,最常见的像QQ、微信不同电脑端的登录,前面登录的账号会被挤兑下线
  • 比如QQ 我们在一处登录QQ之后。如果我们在另一台电脑上再次登录这个时候就会被踢下线  2。我使用的邮箱也有上面情况  这样做在很大的程度上面保证了。账号的安全。  怎么样实现方法1 : 在用户登录时将用户登录...
  • 小程序如何实现订阅消息

    千次阅读 2020-07-12 16:57:15
    小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能。 步骤一:获取模板ID 在微信公众平台手动配置获取模板ID: 登录https://mp.weixin.qq.com获取模板,如果没有合适的模板,可以申请添加新...
  • 新版博客不能设置皮肤(点击查看旧版皮肤下线公告),默认皮肤实在不习惯,自己研究了下,发现修改前端代码可以替换,现在分享给大家 博客设置 f12打开调试器,用元素选择器选择皮肤,找到下面的代码 可以看到每一个...
  • 山寨QQ源代码

    热门讨论 2012-02-11 08:20:49
    资源分设为1,因为我自己只有3分资源分了,所以就不设为0了 这个山寨QQ代码2000行,基于现在可以使用...用户下线后,和服务器已建立的套接字发生IOException异常,程序代码块跳转,服务器就通知用户的在线好友有人下线了。
  • 现象1:qq、MSN的异常登录提醒 你在登录QQ时,系统提示上一次的登录IP和你完全不相干。比如,你明明就只在上海的家里上过,qq却提醒你上一次登录地点在沈阳。 还有,当你登录MSN时,可能有朋友给你发消息,问你刚...
  • 共22讲,讲解如何实现一个仿腾讯QQ即时通信系统的课程;主要功能有:用户注册,登录,登录后QQ号码保存在登录下拉框中;修改个人资料,查找好友,添加好友,删除好友;在线聊天,上线通知,下线通知,更改状态,更换...
  • QQ三国行脚第三方软件检测机制

    千次阅读 2012-11-02 18:45:38
    那么QQ三国客户端又是如何进行第三方软件的检测呢? 最近用C++写了一个全自动跑行脚的小程序,程序只向三国客户端发送按键和鼠标移动命令,不改变任务客户端的数据. 用两个号测试, 第一个号自动跑了二十多次就被...
  • 系统在设计时需要保证用户唯一登录,如现在的QQ等只能在一端登入。就是用户用A这个账号登录之后,其他人都不能再使用登录了。如果另一个用户登录的话,就会把当前这个用户踢下线来。 设计流程 核心代码 // ...
  • 如何检测同一账号的重复登录

    千次阅读 2007-10-20 10:34:00
    想到金融、影院、远程教学、甚至QQ(用的是单点登录机制,后一个登录的会强迫前一登录的下线)都有类似的功能,这对他们来说是起码的要求,否则N多个人只买一个帐号然后同时登录,那不亏死了。 这问题我的第一反应...
  • 踢人下线 —— 将违规用户立刻清退下线 账号封禁 —— 封禁指定账号,使其无法登陆,还可指定解封时间 持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失 分布式会话 —— 提供jwt集成和...
  • WEB开发中的会话控制

    2014-10-29 10:34:57
    Session技术是网站技术中不可或缺的一个重点。主要用户跟踪用户的登录信息,实现跨页面传值。...为了激起同学们的兴趣,以QQ帐号登录为例子,如果同一个帐号在多地被使用,后者将前者踢下线如何做到的呢?先让大家
  • java多线程

    2018-11-21 13:00:25
    进程:操作系统运行的程序,比如运行了两个qq,即开启了两个qq的进程,开启了一个浏览器,一个记事本,相当于开启了一个浏览器进程,一个记事本进程。 线程:存在于进程中,是CPU调度的最小单元。 如何调度进程和...
  • 那么如何可以做到类似QQ的好友列表功能呢,如 大厅好友解决方案包括: 1、业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间; 2、客户端可以获得好友上线、下线的状态通知; 3、...
  • 即时通讯 好友列表业务逻辑详解

    千次阅读 2015-01-09 09:59:44
    那么如何可以做到类似QQ的好友列表功能呢,如 大厅好友解决方案包括: 1、业务服务器可以设置用户的好友列表,客户端可以获得好友列表,不需要进入房间; 2、客户端可以获得好友上线、下线的状态通知; 3、业务...
  • 数据结构于算法—线性表

    千次阅读 2019-08-04 13:15:34
    通过前面[数据结构与算法前导](https://blog.csdn.net/qq_40693171/article/details/96913019)我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容。当然,我用`自己的理解解`分享给大家。 -...
  • 会话控制

    千次阅读 2013-09-03 23:53:48
    Session技术是网站技术中不可或缺的一个重点。...为了激起同学们的兴趣,以QQ帐号登录为例子,如果同一个帐号在多地被使用,后者将前者踢下线如何做到的呢?先让大家思考,然后讲解SESSIONID的概念。
  • 4、含有丰富的表情功能、消息提示音、客户下线通知功能,让您的聊天声情并茂~ 管理员可查看任何一个客服聊天记录、修改客服名称与密码; 如何安装Me客服系统? 1、将整个客服系统文件拷贝到网站根目录下,打开...
  • 四、如何使用:  步骤 1 - 安装  1.将系统文件上传到你的空间根目录下.  (1)不要将系统文件放在空间根目录下的一个文件夹内,要安装在根目录下!  (2)空间必须支持.net2.0,支持MSSQL2000才能保证系统正常...
  • 系统还嵌入了收藏功能,会员可以把有用的商家和资讯信息添加到QQ标签、百度收藏夹....,上面谈到的分销模式更是平台运作宣传和 推广的得力手段!!!  15、系统的扩展性强:全诚外卖通以外卖为重点推出该系统,...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

qq如何下线